一.简介

  大多数查询都使用 了标准的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搜索解析及查询解析器用法概述的更多相关文章

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

    Solr实现Low Level查询解析(QParser) Solr基于Lucene提供了方便的查询解析和搜索服务器的功能,可以以插件的方式集成,非常容易的扩展我们自己需要的查询解析方式.其中,Solr ...

  2. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

  3. Solr查询配置及优化【eDisMax查询解析器】

    一.简介 Lucene查询解析器语法支持创建任意复杂的布尔查询,但还有一些缺点,它不是用户查询处理的理想解决方案.这里面最大的问题是Lucene查询解析器的语法要求严格,一旦破坏就会抛出异常.指望用户 ...

  4. Solr Dismax查询解析器-深入分析

    Solr 支持多种查询解析,给搜索引擎开发人员提供灵活的查询解析.Solr 中主要包含这几个查询解析器:标准查询解析器.DisMax 查询解析器,扩展 DisMax 查询解析器(eDisMax) Di ...

  5. solr 查询解析器

    定义 查询解析器用于将查询语句(q参数)解析成搜索语法. 默认解析器:lucene Solr在查询的时候,用到了QueryParser对用户输入做解析,solr默认使用的解析器是lucene,被称之为 ...

  6. Solr系列六:solr搜索详解优化查询结果(分面搜索、搜索结果高亮、查询建议、折叠展开结果、结果分组、其他搜索特性介绍)

    一.分面搜索 1. 什么是分面搜索? 分面搜索:在搜索结果的基础上进行按指定维度的统计,以展示搜索结果的另一面信息.类似于SQL语句的group by 分面搜索的示例: http://localhos ...

  7. lucene_04_解析语法查询

    解析语法查询就是调用方法查询的原始查询 例如: 查询所有的查询器的语法为:*:*,因为lucene查询是根据term来做的,既是:key:value类型.*:*表示所有域中的所有值. api调用语法解 ...

  8. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  9. 关于ORACLE的硬解析和软解析与MySQL的查询缓存query_cache探讨

    今天在项目中探讨到Oracle对于SQL语句的解析方法以及MySQL相应的处理方法: --------------------------------------------------------- ...

随机推荐

  1. Java StringBuilder类

    StringBuilder的原理 String类 字符串是常量,它们的值在创建之后不能更改 字符串的底层是一个被final修饰的数组,不能改变 private final byte[] value; ...

  2. 前端笔记7-js3

    1.方法: //创建一个对象var obj = {name:"孙悟空",age:18}; //对象的属性也可以是对象 obj.brother = {name:"猪八戒&q ...

  3. 关于后缀间$LCP$的一些公式的证明

    目录 关于\(LCP\)有如下两个公式: \(LCP~Lemma\) 的证明: \(LCP~Theorem\) 的证明: 关于\(LCP\)有如下两个公式: \(LCP~Lemma:\) 对任意 \( ...

  4. Linux.vim编辑器显示行号

    显示行号 :set number 取消显示行号:set nonumber

  5. Please verify that your device’s clock is properly set, and that your signing certificate is not expired.

    解决方法: 1.关闭项目,找到项目文件XXXX.xcodeproj,在文件上点击右键,选择“显示包内容”(Show Package Contents).会新打开一个Finder. 2.在新打开的Fin ...

  6. 头条一面竟然问我Maven?

    maven package和maven install 有什么区别? 你常用的maven命令有哪些? <dependencyManagement> 是干什么的? 还有用过其它构建工具吗? ...

  7. Qt Installer Framework翻译(2)

    开始 Qt IFW作为Qt项目的一部分进行开发.该框架自身也使用Qt.然而,它能被用于安装所有类型的应用程序,包括(但不限于)使用Qt编译的. 支持的平台 已在下列平台中进行了测试: > Mic ...

  8. Java入门 - 语言基础 - 16.数组

    原文地址:http://www.work100.net/training/java-array.html 更多教程:光束云 - 免费课程 数组 序号 文内章节 视频 1 概述 2 声明数组变量 3 创 ...

  9. moco响应中文乱码

    moco版本为:moco-runner-standalone-0.11.1.jar 在一次使用moco框架的时候,浏览器查看响应时,发现返回来的中文是乱码. 按照网上的操作,在响应结果中加上heade ...

  10. Python入门小建议

    "java从心"正式更名"KEN DO EVERTHING".Ken(Can) Do Everything,无所不能 Believe youseft then ...