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能够解析的形式为:
- +((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字符串:
- 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=&rows=
查询的各个关键词会解析为OR运算,并非我们的设计意图,如果需要的话,可以修改LuceneQParser,将其中的”+“解析成MUST,才能按实际需要搜索。
Solr实现Low Level查询解析(QParser)的更多相关文章
- Solr Dismax查询解析器-深入分析
Solr 支持多种查询解析,给搜索引擎开发人员提供灵活的查询解析.Solr 中主要包含这几个查询解析器:标准查询解析器.DisMax 查询解析器,扩展 DisMax 查询解析器(eDisMax) Di ...
- solr 查询解析器
定义 查询解析器用于将查询语句(q参数)解析成搜索语法. 默认解析器:lucene Solr在查询的时候,用到了QueryParser对用户输入做解析,solr默认使用的解析器是lucene,被称之为 ...
- Solr搜索解析及查询解析器用法概述
一.简介 大多数查询都使用 了标准的Solr语法.这种语法是Solr最常见的,由默认查询解析器负责处理.Solr的默认查询解析器是Lucene查询解析器[LuceneQParserPlugin类实现] ...
- Solr查询配置及优化【eDisMax查询解析器】
一.简介 Lucene查询解析器语法支持创建任意复杂的布尔查询,但还有一些缺点,它不是用户查询处理的理想解决方案.这里面最大的问题是Lucene查询解析器的语法要求严格,一旦破坏就会抛出异常.指望用户 ...
- 使用Java Low Level REST Client操作elasticsearch
Java REST客户端有两种风格: Java低级别REST客户端(Java Low Level REST Client,以后都简称低级客户端算了,难得码字):Elasticsearch的官方low- ...
- Elasticsearch java api操作(一)(Java Low Level Rest Client)
一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...
- C++ Low level performance optimize 2
C++ Low level performance optimize 2 上一篇 文章讨论了一些底层代码的优化技巧,本文继续讨论一些相关的内容. 首先,上一篇文章讨论cache missing的重要性 ...
- C++ Low level performance optimize
C++ Low level performance optimize 1. May I have 1 bit ? 下面两段代码,哪一个占用空间更少,那个速度更快?思考10秒再继续往下看:) //v1 ...
- zabbix监控redis多实例(low level discovery)
对于多实例部署的tomcat.redis等应用,可以利用zabbix的low level discovery功能来实现监控,减少重复操作. 注:Zabbix版本: Zabbix 3.0.2 一.服务 ...
随机推荐
- MySQL utf8mb4 字符集:支持 emoji 表情符号
转载地址:http://www.linuxidc.com/Linux/2013-05/84360.htm 我用他的方法解决了问题,亲测可用,不要用Nnvicat for Mysql去查询编码,在服务器 ...
- CSS之水平垂直居中
在css的世界里,如果我们想让一个块级元素水平居中,想必大家都知道利用margin:0 auto;嘛,这样就可以让块级元素在它的父元素中水平居中了. 列如这样: <!DOCTYPE html&g ...
- android view 中各函数的执行顺数
这个就好像是 activity 的生命周期一样,如果我们要使用自定义的 view,那么就很有必要了解一下 view 的那些能够被重写的函数的执行顺序.废话不多讲,以常用的5个函数为例子,见下文: pa ...
- JavaScrict中的断言调试
今天在看忍者秘籍的时候,看到一个断言方法.查阅了一下资料,原来javascript中的console也包含这个方法.具体用法如下: <script type="text/javascr ...
- 相克军_Oracle体系_随堂笔记002-基础
1.常见的Oracle生产库环境: 图2-1可以说是标准的生产库环境,处处体现了冗余,有效防止了单点故障.这就是HA(高可用) 而且冗在某种条件下还可以去掉,平常实现同时运行提供服务,如果一台坏掉,另 ...
- 微信小程序探究
前段时间比较流行的微信小程序,因为一直没有所谓内测码也没具体关注.拖到现在正好借组内分享的时机来仔细了解一下微信小程序.了解一个新的事物无外乎从是什么(本质),怎么用(具体用法),为什么用(优缺点)来 ...
- 关于Javascript作用域及作用域链的总结
本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/200 ...
- C# GZip对字符串压缩和解压
/// <summary> /// 压缩方法 /// </summary> public static string CompressString(string str) { ...
- Redis在windows下安装过程
一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...
- 自己实现简单的AOP(五)使Demo适应webApi、亦可完成属性自动注入
在前文的Demo中,webApi的Controller是不能自动注入的,原因是 IHttpController 和 IController 是通过两个不同的途径进行激活的. IHttpControll ...