Solr实现Low Level查询解析(QParser)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr实现Low Level查询解析(QParser)相关的知识,希望对你有一定的参考价值。

Solr实现Low Level查询解析(QParser)

Solr基于Lucene提供了方便的查询解析和搜索服务器的功能,可以以插件的方式集成,非常容易的扩展我们自己需要的查询解析方式。其中,Solr内置了一些QParser,对一些没有特殊要求的应用来说,可以直接使用这些查询解析组件,而无需做任何修改,只需要了解这些查询解析组件提供的基本参数(Local Params),就可以实现强大的搜索功能。

对于Solr来说,它的设计目标就是尽可能屏蔽底层Lucene的复杂度和难点,而是通过提供可配置的方式来实现全文检索。我们标题所说的Low Level是指,在Solr里面直接使用Lucene的查询语法,来构造满足需要的查询,例如:+(title:solr) +(+(title:lucene content:Hadoop) (title:search)),这样的话,你应该了解Lucene的查询语法。因为在实际应用中,完全使用Solr自带一些QParser可能不能够达到我们的目的,比如,你在对数据进行索引,索引时使用了词典的方式进行分词,词典中出现的一些关键词很可能是与用户交互设计中内容相关的(如搜索某个关键词,向用户推荐一些向关键词),那么,在前端需要将某些关键词进行某种组合,提交到后端进行解析搜索。在后端,就会存在一个专门的查询解析组件(在Solr中成为QParser,可以扩展),最终将解析成Lucene识别的“语言”,从而进行索引搜索,返回搜索结果。

下面是一个简单的例子:

用户搜索“北京”,我需要提供相关的一组同义关键词:“北平”、”首都“、”京城“、”京都“;而此时,与”北京“相关的一组关键词:”首都博物馆“、”故宫“、”天坛“、”八达岭长城“,其中”首博“是”首都博物馆“的同义词;我们需要实现的是,当用户搜索”北京“时,对其进行同义词扩展搜索(这个在Solr里面可以直接使用同义词Analyzer),但是当用户点击这组相关关键词时,需要进行扩展,比如点击”首都博物馆“进行搜索,这时扩展搜索Lucene能够解析的形式为:

  1. +((title:北京 content:北京) (title:北平 content:北平) (title:首都 content:首都) (title:京城 content:京城) (title:京都 content:京都)) +((title:首都博物馆 content:首都博物馆) (title:首博 content:首博))  

实际上,如果直接使用Lucene,可能会比较容易的多,只需要根据分词词典中具有的Term(存在于索引中),构造满足实际需要的Query即可实现搜索。但是,在Solr里面,将构造查询解析的逻辑移到了QParser中,基于QParserPlugin可以很好地使用Solr提供的一些基础组件和附加组件,并且,这些自定义组件都是基于solrconfig.xml来进行配置的,比较灵活。

当然,Solr提供了一个QParserPlugin插件,核心查询解析在LuceneQParser中实现,是一个相对Low Level的组件,只需要在solrconfig.xml中配置好相应的requestHandler即可,实例如下:

    <queryParser name="lucene" class="org.apache.solr.search.LuceneQParserPlugin"/>  
    <requestHandler name="/lucene" class="solr.SearchHandler">  
      <lst name="defaults">  
        <str name="defType">lucene</str>  
        <str name="bf">recip(ms(NOW,publishDate),3.16e-13,1,1)</str>  
        <str name="qf">title^1.50 content</str>  
          
        <bool name="hl">true</bool>  
        <str name="hl.fl">title content</str>  
        <int name="hl.fragsize">100</int>  
        <int name="hl.snippets">3</int>  
          
        <str name="fl">*,score</str>  
        <str name="qt">standard</str>  
        <str name="wt">standard</str>  
        <str name="version">2.2</str>  
        <str name="echoParams">explicit</str>  
        <str name="indent">true</str>  
        <str name="debugQuery">on</str>  
        <str name="explainOther">on</str>  
      </lst>  
    </requestHandler>  

 

启动Solr搜索服务器(如,部署在tomcat容器中),如果你直接输入上述Lucene能够识别的Query字符串:

  1. http://192.168.9.171:8080/solr/core3/lucene/?q=+((title:北京 content:北京) (title:北平 content:北平) (title:首都 content:首都) (title:京城 content:京城) (title:京都 content:京都)) +((title:首都博物馆 content:首都博物馆) (title:首博 content:首博))&start=0&rows=10  

查询的各个关键词会解析为OR运算,并非我们的设计意图,如果需要的话,可以修改LuceneQParser,将其中的”+“解析成MUST,才能按实际需要搜索。

以上是关于Solr实现Low Level查询解析(QParser)的主要内容,如果未能解决你的问题,请参考以下文章

Solr查询解析器大全

每日一题_Python.纯Python实现Low-Level discovery动态服务发现?

solr中使用了什么类型的解析器

Solr/Lucene 查询词形还原与上下文

solr搜索流程

Solr查询中的双引号