solr查询不使用query analyzer中文分词的问题解决

 

schema.xml已配置query的中文分词器,但搜索的结果不尽如意,solr并没有按照分词来进行搜索。比如搜索“我要吃饭了”,并没有把包含“吃饭”的文档给搜索出来。解决过程如下:

1.query analyzer使用IK,配置如下:
Xml代码 复制代码  收藏代码
  1. <analyzer type ="query" >  
  2.        <tokenizer class ="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false" />  

2.query analyzer效果如图:

我要吃饭了,可分词为“要吃”和“吃饭”。如果搜索“我要吃饭了”,solr应该把这两个词以OR的方式去搜索,结果却一厢情愿。

3.引用http://blog.chenlb.com/2010/08/get-solr-analysis-word.html
“这个问题的根本原因是 lucene / solr 使用的查询解析器生成的 Query 是短语查询。短语查询默认又是连续的词中没有其它字符。所以会找不到。
目前我知的方式大概有二种:
1、查询前分词一遍,把分出的词用空格分开,再去搜索(叫它为查询预处理)。查询前分词可以上面的接口。
2、扩展 solr query parser,返回 boolean query。”


4.使用方法1解决问题
即搜索前,先处理一下query analyzer的分词,然后再搜索。
solr分词的接口为:http://localhost:8080/solr/analysis/field?q=我要吃饭了
如果为多核配置,类似于http://localhost:8080/solr/核心名/analysis/field?q=我要吃饭了

结果返回:
Xml代码 复制代码  收藏代码
  1. <response>  
  2.      <lst name="responseHeader">  
  3.           <int name="status">0</int>  
  4.           <int name="QTime">0</int>  
  5.      </lst>  
  6.      <lst name="analysis">  
  7.           <lst name="field_types" />  
  8.           <lst name="field_names">  
  9.                <lst name="text">  
  10.                     <lst name="query">  
  11.                          <arr name="org.wltea.analyzer.lucene.IKTokenizer">  
  12.                               <lst>  
  13.                                    <str name="text">要吃</str>  
  14.                                    <str name="type">word</str>  
  15.                                    <int name="start">1</int>  
  16.                                    <int name="end">3</int>  
  17.                                    <int name="position">2</int>  
  18.                               </lst>  
  19.                               <lst>  
  20.                                    <str name="text">吃饭</str>  
  21.                                    <str name="type">word</str>  
  22.                                    <int name="start">2</int>  
  23.                                    <int name="end">4</int>  
  24.                                    <int name="position">3</int>  
  25.                               </lst>  
  26.                          </arr>  
  27.                     </lst>  
  28.                </lst>  
  29.           </lst>  
  30.      </lst>  
  31. </response>  

注意<lst name="query">元素下可能有filter。我们只需要解析以上的xml,就可以获取到分词列表了。

最后,将分词列表组装成类似(要吃 OR 吃饭)的格式,就可以搜索到想要的结果。例如:
http://localhost:8080/solr/select/?q=(要吃 OR 吃饭)

 

solr4.0+IKAnalyzer安装好后,根据IKAnalyzer的安装文档在schema.xml做了配置,“随意问技术百科”已索引,但是搜索“随意问”搜索不出结果。

通过在solr的管理界面进行查询,开启 debugQuery(调试模式),查询q参数输入,test:随意问,输出结果中发现:

<lst name="debug">
<str name="rawquerystring">test:随意问</str>
<str name="querystring">test:随意问</str>
<str name="parsedquery">PhraseQuery(test:"随意 问")</str>
<str name="parsedquery_toString">test:"随意 问"</str>
<lst name="explain"/>
<str name="QParser">LuceneQParser</str>
...

说明中文分词有效果了,但是test:随意问,变成了test:"随意 问",应该是 test:随意 test:问,下面是正确的情况下的调试结果:

<lst name="debug">
<str name="rawquerystring">test:随意问</str>
<str name="querystring">test:随意问</str>
<str name="parsedquery">test:随意 test:问</str>
<str name="parsedquery_toString">test:随意 test:问</str>
<lst name="explain"/>
<str name="QParser">LuceneQParser</str>
...

找了半天,不知道哪里配错了。

 

我在配置solr4.0的时候也遇到相同的问题。

修改schema.xml,将

<schema name="example core zero" version="1.1">

修改为

<schema name="example core zero" version="1.5">

重新加载配置文件就OK了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值