Solr搜索解析及查询解析器用法概述
一.简介
大多数查询都使用 了标准的Solr语法。这种语法是Solr最常见的,由默认查询解析器负责处理。Solr的默认查询解析器是Lucene查询解析器【LuceneQParserPlugin类实现】。Lucene查询解析器全面支持Lucene语法及Solr的一些专用扩展。
二.Lucene查询解析器语法
1.字段搜索
在Solr索引中搜索一个值时,一般来说是在特定字段上进行查找。字段搜索语法是:字段名称+‘:’+搜索内容,举例如下:
title:solr 或 title:"apache solr" request_content_split:(流程 问题) 备注:括号表示集合,用空格隔开每个元素,默认表示OR的含义
尽管关键词搜索不明确指定字段的做法很常见,大需要注意的是,一般在定义的默认字段上进行关键词搜索。举例来说,如果content定义为默认字段【df=content】,则以下两个查询是等价的:
solr 或 content:solr
还需要注意的是,字段和冒号后面的表达式范围必须明确定义。以下两个查询是等价的【假设df=content】,不过在第一个查询中用户可能存在其他意图。
title:apache solr 或 title:apache content:solr
如果在同一个字段中搜索多个词项,使用组合表达式,在字段搜索中指定词项的范围:
title:(apache solr)
如果尝试短语搜索,使用引号【而不是括号】来定义短语范围,尽管这样会导致查询要求短语的所有词项必须同时出现。
title:"apache solr"
2.必备词项【使用较少】
为指定一个或多个词项必须出现,使用一元运算符+来连接词项。除非文档包含指定的词项,否则不予匹配。如果匹配的文档必须包含多个词项,使用二元运算符AND或&&,否则对每个词项都使用一元运算符+。
如果默认运算符是AND,在没有指定其他运算符的情况下,每个词项都要求必备。由于每增加一个必备词项都会进一步限制文档集中的结果总数,因此通过使用多个必备词项可以加快查询速度,从而进一步优化结果数量。
3.可选词项
相比限制必备字段的做法,扩大匹配的文档数量则适用于另外一些情况。默认运算符是OR,除非有其他指定,否则每个表达式都是可选的。同样地,多个表达式之间使用二元运算符OR或||,这表示匹配的文档中至少包含其中一个词项。
值得注意的是,可选词项越多会导致匹配文档集越大,OR运算比其它布尔运算的执行成本更高。对于关键词搜索,如果内容数量有限,而且希望以牺牲查准率为代价,确保能够返回一些结果【更高的查全率】,那么会考虑使用OR作为默认运算符。由于多个可选词项的文档匹配通常会导致较高的相关度得分,使用OR作为默认运算符并根据相关度得分排名的话,仍然有可能获得搜索结果中最相关的那部分结果。不过,与要求匹配所有关键词不同的是,扩展查询会得到更多一些奇怪的匹配结果。
4.短语搜索【使用较少,且必须使用在使用了分词器的字段上】
如果想要匹配彼此相邻的多个词项,使用引号把它们括起来视为一个短语。此查询表达式不能保证匹配出完全一样的文本,被搜索字段可能包含对短语中词项进行修改的分析器。最合理的特定短语搜索不应该匹配无关的短语。短语搜索适用于内容中特定字段和多词名称的处理。
5.组合表达式【常用】
为处理任意复杂的布尔子句,Solr使用括号将查询表达式组合在一起。
组合表达式可以设置表达式的上下文,例如,指明在同一个字段中搜索多个单词。组合表达式可以任意嵌套。
6.词项邻近度
短语搜索是词项相似度搜索的简化版本。通过添加波浪线和词项位置距离数搜索位置相近的词项,不一定是相邻的。
短语搜索是词项位置距离为0的邻近搜索。
词项距离为3表示查询两词之间词项距离<=3的搜索,两词项交换位置相当于移动了两个词项位置。
指定足够大的有效邻近值,可以匹配出文档中任意位置的词项,这与AND查询效果类似。词项邻近度查询还有一个副作用,在文档中词项越靠近,该邻接查询对应的相关度得分就越高。与组合查询相比,当词项距离较大时,使用邻近词搜索花费成本更高。
7.字符邻近
不仅可以在词项之间进行邻近搜索,还可以对词项中的字符进行基于编辑距离的搜索,找到拼写相似的词项。字符邻近搜索的语法与词项邻近搜索类似,由于字符邻近搜索处理的是一个词项,因此不带引号。
1表示与搜索词项最多有一个字符的差距,包括多一个字符,少一个字符和一个字符不一样三种情况。
8.排除词项
有时我们需要从查询中明确排除特定词项。在表达式上使用一元运算符-【减号】或在表达式之间使用NOT布尔运算符来排除词项。
或
9.区间搜索【方括号为闭区间,花括号为开区间】
有时候我们不希望查询表达式只匹配出一个值,而是匹配出值的整个区间。区间可以是数值区间、日期区间或字符串区间。区间搜索能够找到指定的一组值,其语法为字段名加冒号再加一个方括号。
如果没有指定区间的最大值和最小值,则需要对开区间的上限和下线使用通配符*
10.通配符搜索
有些情况下用户需要对Solr索引中单词或短语的变体进行匹配。对于用户输入的大多数关键词而言,词干提取这类技术让通配符搜索变得没那么重要了,然而对于查找以特定字符集开头的文档或替代单个字符的操作,通配符搜索还是还有用武之地的。
11.权重表达式
如果表达式后面指定了一个插入号【^】,无论是词项、短语还是组合表达式,都可以调整相关度权重。
12.特殊字符转义【分词器字段除外】
Solr中有些字符是保留字符,也就是说,它们被当做查询语法进行解析,而不是作为搜索词项。包括:
如果要搜索保留字符,必须将保留字符用引号括起来,或者使用反斜杠对其进行转义。关键词中处理保留字符的推荐做法是在传入Solr之前去除没有搜索价值的保留字符,或者对它们依次使用反斜杠进行转义。
当搜索字段为分词器字段时,保留字符会被分词过滤掉,因此搜索时不加保留字符也可以搜索到!
Solr搜索解析及查询解析器用法概述的更多相关文章
- Solr实现Low Level查询解析(QParser)
Solr实现Low Level查询解析(QParser) Solr基于Lucene提供了方便的查询解析和搜索服务器的功能,可以以插件的方式集成,非常容易的扩展我们自己需要的查询解析方式.其中,Solr ...
- Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)
一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...
- Solr查询配置及优化【eDisMax查询解析器】
一.简介 Lucene查询解析器语法支持创建任意复杂的布尔查询,但还有一些缺点,它不是用户查询处理的理想解决方案.这里面最大的问题是Lucene查询解析器的语法要求严格,一旦破坏就会抛出异常.指望用户 ...
- Solr Dismax查询解析器-深入分析
Solr 支持多种查询解析,给搜索引擎开发人员提供灵活的查询解析.Solr 中主要包含这几个查询解析器:标准查询解析器.DisMax 查询解析器,扩展 DisMax 查询解析器(eDisMax) Di ...
- solr 查询解析器
定义 查询解析器用于将查询语句(q参数)解析成搜索语法. 默认解析器:lucene Solr在查询的时候,用到了QueryParser对用户输入做解析,solr默认使用的解析器是lucene,被称之为 ...
- Solr系列六:solr搜索详解优化查询结果(分面搜索、搜索结果高亮、查询建议、折叠展开结果、结果分组、其他搜索特性介绍)
一.分面搜索 1. 什么是分面搜索? 分面搜索:在搜索结果的基础上进行按指定维度的统计,以展示搜索结果的另一面信息.类似于SQL语句的group by 分面搜索的示例: http://localhos ...
- lucene_04_解析语法查询
解析语法查询就是调用方法查询的原始查询 例如: 查询所有的查询器的语法为:*:*,因为lucene查询是根据term来做的,既是:key:value类型.*:*表示所有域中的所有值. api调用语法解 ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- 关于ORACLE的硬解析和软解析与MySQL的查询缓存query_cache探讨
今天在项目中探讨到Oracle对于SQL语句的解析方法以及MySQL相应的处理方法: --------------------------------------------------------- ...
随机推荐
- 【GeneXus】在WorkWithPlus中如何定义未被包含的页面属性?
在使用GeneXus开发项目的过程中,有很多用户会使用到WorkWithPlus这个模板.通过WorkWithPlus的编辑器,让页面的调整变得极为简单,尤其是响应式页面.在WorkWithPlus的 ...
- Mysql中使用mysqldump进行导入导出sql文件
纪念工作中的第一次删库跑路的经历 今天接到一个任务,是将一个测试库数据导到另一个测试库,然而我们公司的数据库是不让直连的,所以只能通过远程连接进行导库操作. 老大布置任务的时候让用dump命令进行操作 ...
- CTO说|非容器化应用怎么玩多云?Kubernetes不管我们管啊
Kubernetes已经成为容器编排系统的事实标准,是现在主流的跨云容器化应用操作系统. 但是,Kubernetes的目标并不是容器本身,而是承载其上的应用,本质上是为了解决(容器化)应用上云这个难题 ...
- 微信小程序--百度地图坐标转换成腾讯地图坐标
最近开发小程序时出现一个问题,后台程序坐标采用的时百度地图的坐标,因为小程序地图时采用的腾讯地图的坐标系,两种坐标有一定的误差,导致位置信息显示不正确.现在需要一个可以转换两种坐标的方法,经过查询发现 ...
- C++Primer第五版 6.1节练习
练习6.1:实参和形参的区别是什么? 通俗解释: 实参是形参的初始值.编译器能以任意可行的顺序对实参求值.实参的类型必须与对应的形参类型匹配. 详解1) 形参变量只有在函数被调用时才会分配内存,调用结 ...
- 用Django自动生成表遇到问题
因为以前在数据库中已经生成过Django 叫App01下的表,所以无法生成,在数据库中执行这个命令 DELETE FROM django_migrations WHERE app='App01';然后 ...
- Zookeeeper的安装与集群搭建
简介 Zookeeper下载 官网地址:点我直达 百度云盘:点我直达 踩坑录 官网下载一定要下载带bin的 要不然zookeeper起不起来,找不到加载类,原来从版本3.5.5开始,带有bin名称的包 ...
- RocketMQ客户端加载流程
这节介绍RocketMQ客户端的启动流程,即Consumer和Producer的启动流程. 1. 客户端demo 首先先看下客户端的demo Producer: public class Sync ...
- 用PHP写下HELLO WORLD!
一.选择PHP开发工具 1.phpstorm最新版本 2.打开phpstorm界面 按create键,选择new window ,出下如下页面: 鼠标放在文件夹上,右键单击,弹出以下对话框:做如下操作 ...
- Java单体应用 - Markdown - 01.简介
原文地址:http://www.work100.net/training/monolithic-markdown.html 更多教程:光束云 - 免费课程 简介 序号 文内章节 视频 1 概述 2 特 ...