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

随手一记 2011-01-18

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

1.query analyzer使用IK,配置如下:
<analyzer type ="query" >
       <tokenizer class ="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false" />

2.queryanalyzer效果如图:

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

3.引用http://blog.chenlb.com/2010/08/get-solr-analysis-word.html

“这个问题的根本原因是lucene/solr使用的查询解析器生成的Query是短语查询。短语查询默认又是连续的词中没有其它字符。所以会找不到。

目前我知的方式大概有二种:

1、查询前分词一遍,把分出的词用空格分开,再去搜索(叫它为查询预处理)。查询前分词可以上面的接口。

2、扩展solrqueryparser,返回booleanquery。”

4.使用方法1解决问题

即搜索前,先处理一下queryanalyzer的分词,然后再搜索。

solr分词的接口为:http://localhost:8080/solr/analysis/field?q=我要吃饭了

如果为多核配置,类似于http://localhost:8080/solr/核心名/analysis/field?q=我要吃饭了

结果返回:

<response>
     <lst name="responseHeader">
          <int name="status">0</int>
          <int name="QTime">0</int>
     </lst>
     <lst name="analysis">
          <lst name="field_types" />
          <lst name="field_names">
               <lst name="text">
                    <lst name="query">
                         <arr name="org.wltea.analyzer.lucene.IKTokenizer">
                              <lst>
                                   <str name="text">要吃</str>
                                   <str name="type">word</str>
                                   <int name="start">1</int>
                                   <int name="end">3</int>
                                   <int name="position">2</int>
                              </lst>
                              <lst>
                                   <str name="text">吃饭</str>
                                   <str name="type">word</str>
                                   <int name="start">2</int>
                                   <int name="end">4</int>
                                   <int name="position">3</int>
                              </lst>
                         </arr>
                    </lst>
               </lst>
          </lst>
     </lst>
</response>
注意<lst name="query">元素下可能有filter。我们只需要解析以上的xml,就可以获取到分词列表了。

最后,将分词列表组装成类似(要吃OR吃饭)的格式,就可以搜索到想要的结果。例如:

http://localhost:8080/solr/select/?q=(要吃OR吃饭)

相关推荐

lionelf / 0评论 2020-07-28