一、Solr Multivalue field属性positionIncrementGap理解

分类:Lucene
2014-01-22 10:39阅读(3596)评论(0)
参考:http://rockiee281.blog.163.com/blog/static/19385222920127225619919/

 
Solr里头可以设计Field为Multivalue类型,这样的一个好处是可以很方便的设置copyField,在我们的项目中也有使用。

但是一直以来都有一个问题困扰着我,就是对multivalue里头多个值域的搜索问题。多个value之间我认为应该是保持相互独立的,但是在实际搜索中感觉solr把所有的值域都串在一起,当作一个长value来处理,没有达到我想要的效果。后来通过搜索,我发现solr的field type中有一个positionIncrementGap字段,
,在网上看到一段讨论:http://lucene.472066.n3.nabble.com/positionIncrementGap-in-schema-xml-td488338.html。其中有人举了一个例子:
一看之下大喜过望,这不是就是我想要的效果么 马上去翻我solr的schema.xml的配置,一看我就凉了:
<fieldtype name="textComplex" class="solr.TextField" positionIncrementGap="100">
<analyzer type="query">
     <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="dic">
  </tokenizer>
  <filter class="solr.SynonymFilterFactory" synonyms="synonyms_filter.txt" ignoreCase="true" expand="false"/>
  <filter class="solr.StandardFilterFactory"/>  
</analyzer>
<analyzer type="index">
     <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"    mode="complex" dicPath="dic">
  </tokenizer>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_filter.txt" ignoreCase="true" expand="false"/>
<filter class="solr.StandardFilterFactory"/>  
</analyzer>
</fieldtype>
居然之前已经配置过了!!!那就是这个配置没有生效,是什么造成的呢?因为我没有使用solr自己的standardTokenizerFactory,而是为了中文分词使用了MMSeg4J的类,我就把怀疑的目光放到了MMSeg4J身上。检查了MMSegTokenizerFactory的源代码,发现里头木有对positionIncrementGap的处理,以为问题出在这里,但是在深入对比MMSegTokenizerFactory和StandardTokenizerFactory及相关的代码类之后,感觉问题不应该出在建立索引的环节。
 
之后就是搜了一堆的资料,了解了positionIncrementGap这个字段的含义,其作用就是在对Multivalue Field进行处理的时候,给两个field中相隔的词人为的插入一段固定的distance,然后在使用Lucene/Solr做Phrase query的时候,如果没有指定Slop(对slop的介绍,可以参考:http://blog.csdn.net/rick_123/article/details/6708527),会默认Slop为0,即查询的短语之间应该紧紧挨着,这样对很多情况下都得不到用户想要的结果。解决的办法就是使用phrase query,同时设置一个适当的Slop值,然后为了不让lucene的搜索跨越多个Field Value,设置一个远大于slop的positionIncrementGap,就可以达到目标。在这里不用担心positionIncrementGap设置过大会影响效率,尽情的设吧……
 
既然了解positionIncrementGap的含义,问题就一目了然,楼主为了查询的方便,使用自定的QueryParser替换了Solr自己默认的,将Phrase search改为了BooleanSearch,所以实际上导致了positionIncrementGap的失效。解决办法就是将BooleanSearch改为MultiPhraseQuery,同时调用MultiPhraseQuery.setSlop(int slop)方法设置slop为50(经验值,根据索引的数据设定,只要远小于positionIncrementGap即可)。测试ok达到效果!
 
二、多值字段 针对多值字段,查询表达式仍然会被拆分为一个一个的关键词,然后去跨句子去匹配。
三、动态字段 针对动态字段,查询表达式可以精确查到句子,但是不能确保通配查询。

solr 通过【配置、多值字段、动态字段】来解决文本表达式查询精确到句子的问题的更多相关文章

  1. SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...

  2. mysql 动态拼接表字段,值 mybatis 动态获取表字段

    -- 取表所有字段,自动用逗号分开 select GROUP_CONCAT(DISTINCT COLUMN_NAME) from information_schema.columns where ta ...

  3. mysql 之编码配置、引擎介绍、字段操作、数据类型及约束条件

    数据库的配置 # 通过配置文件统一配置的目的: 统一管理 服务端(mysqld) 客户端(client) 配置了mysqld(服务端)的编码为utf8, 那么再创建的数据库,默认编码都采用utf8. ...

  4. mybatis操作动态表+动态字段+存储过程

    存储过程 statementType="CALLABLE" <!-- 计算金额存储过程--> <update id="getCalcDistributo ...

  5. sap 动态字段的使用

    1.sap中的动态字段其实类似c#里面的指针,都是指向的地址. 只是写法不同,sap 中的field-symbols就是类似指针. , b TYPE i. FIELD-SYMBOLS <fs&g ...

  6. Vue 利用后端的数据字典和Map对象实现表格列字段动态转义的处理方案

    1.前言   Vue中,使用el-table组件,经常遇到列字段转义的问题.常规处理方法有以下两种: 方法1:在模板中使用v-if,直接转义.如: <el-table-column label= ...

  7. C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现

    C# 默认是不能修改已装箱了的值类型中字段的值,但是可以通过 值类型实现指定的接口来改变 首先定义一个接口 interface IChange { void Change(int a, int b); ...

  8. 【mybatis】mybatis自定义动态字段查询,mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段

    mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段 先看一下 怎么实现动态的自定义字段查询: 例如: 而field 就是数据表中的某一个字段 String f ...

  9. PHP使用array_filter查找二维数组中符合字段和字段值的数据集合

    1.方法: /** * 获取符合字段和字段值的数组集合 * @param array $data 待过滤数组 * @param string $field 要查找的字段 * @param $value ...

随机推荐

  1. C++ 写的地图控件,支持google 百度 在线离线地图

    C++处理google  百度地图在网上查阅了很多都是通过浏览器方式显示地图信息, 跟我目前项目很不符合, 所以仔细研究了一下C++方式显示地图.通过地图投影以及墨卡托投影,在通过平面地图计算经纬度. ...

  2. Java第八次作业--数据库编程

    Deadline: 2017-5-18 23:00 一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握应用JDBC访问数据库的基本步骤 掌握DriverManager类.Connection接 ...

  3. Linux Framebuffer save as picture

    /********************************************************************************* * Linux Framebuff ...

  4. stm32 定时器TIM时钟步骤

    1)TIM3 时钟使能 . RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE); //时钟使能 2) 初始化定时器参数,设置自动重装值, 分频系数, ...

  5. Linux系统如何制作U盘启动盘更换系统

    进入这个网站balenaEtcher,直接下载可接

  6. Hibernate4.3配置

    <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  7. 理解cookie和session技术

    一.HTTP协议的无状态性 WEB应用程序使用的是HTTP协议传输数据的,HTTP协议是一个无状态的协议,这次数据传输完毕,客户端会和服务端断开连接,再次传输数据就需要重新建立新的连接,这也就无法会话 ...

  8. VPC/VM/VBOX安装GHOST版的无法启动系统

    本人最近在安装一些公司的虚拟机,方便开发使用,不用每次都安装几个小时的装机和安装软件,但是本次却遇到了一点问题,虚拟机安装完成后一直无法进入系统,只有一个光标在黑色的屏幕上一闪一闪的,也没有任何错误提 ...

  9. maven学习--进阶篇

    2016-01-06 02:34:24 继承与聚合 (八)maven移植 讲到maven移植,大家可能第一反应就是是指将一个java项目部署到不同的环境中去,实际上,在maven中,它认为当你参加一个 ...

  10. linux中tomcat内存溢出解决办法

    用命令 tail -f /root/apache-tomcat-6.0.20/logs/catalina.out(需要找到tomcat路径) 查看日志,查看是否有错误 linux中tomcat内存溢出 ...