Lucene Query Parser Syntax
Lucene查询解析器语法
关于包 org.apache.lucene.queryparser.classic 的描述
一个简单的使用JavaCC实现的查询解析器。
注意,因为JavaCC定义了很多没有必要成为public的public类,方法和值域,这使文档变得有些杂乱。Sorry.
注意,因为JavaCC定义了一个名为Token的类,org.apache.lucene.analysis.Token类必须总是以全饰名称在这个包的代码中使用。
注意,org.apache.lucene.queryparser.flexible.standard 有一个匹配其语法的可代替的查询解析器,但对于如何创建一个Query而言,它更加的模块化,能进行大量定制化。
Query Parser Syntax (4.7.2)
====================
http://lucene.apache.org/core/4_7_2/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description
1. 概述
虽然Lucene支持通过API创建你自己的查询,但也通过查询解析器(Query Parser)提供了丰富的查询语言,一个使用JavaCC的语法分析程序(lexer)可以将字符串解析为Lucene查询(对象)。
通常来说,query parser的语法会随着版本的发布而修改。这里描述的是当前发布版本(4.7.2)的语法。如果你正在使用不同版本的Lucene,请查阅随相应版本发布的docs/queryparsersyntax.html副本.
在选择使用所提供的Query Parser前,请作如下考虑:
(1) 如果你要用程序生成查询字符串,然后用query parser解析,那么你应该认真考虑直接使用query API来创建你的查询。换句话说,query parser是为人自然输入文本设计的,而非为程序生成的文本设计。
(2) 未被截断的域最好直接加到query中,而不是通过query parser. 如果一个域的值是通过程序生成的,那么这个域的查询语句也应该如此。query paser使用的分析器(Analyzer)是设计用来转化由人输入的文本到词语(Terms)的。程序生成的值,像日期,关键词等,应该一致由程序生成。
(3) 在一个查询式中,域是通常文本的应该使用query parser. 所有其他,如日期范围,关键词等,最好直接通过API加入查询。一个域有有限个值,可以由一个下拉菜单指定,不应该加入查询字符串并被进一步分割,可以作为一个词查询(TermQuery)语句加入。
2. 词/语句 (Terms)
一个查询被分割为词和操作符。有两种类型的词:独立词和短语。(#这里是就英语来说的)
一个独立词是一个单独的单词,如"test"或"hello".
一个短语是一组由双引号扩起来的单词,如"hello dolly".
多个词(Terms)可以由布尔操作符组合在一起,组成更复杂的查询(见下文)。
注意,创建索引的分析器(Analyzer),将被用在查询字符串的词(Terms)和短语上。所以选择一个不抵触查询字符串使用的词(Terms)的分析器很重要。
3. 域 (Fields)
Lucene支持分域的数据。搜索时可以指定一个域,或使用默认的域。域名和默认域在实现中是可以指定的。
你可以搜索任何域,通过敲入域名后跟随冒号":", 然后输入你想查询的词句。
作为一个例子,我们假定一个Lucene索引包含两个域,标题(title)和文本(text),并且文本是默认域。如果你想找到以"The Right Way"为标题,文本内容包含"don't go this way"的文档,你可以这样输入:
title:"The Right Way" AND text:go
或
title:"The Right Way" AND go
因为text是默认域,域标识名不是必须的。
注意,域名只对出现在其后的词有效,所以查询
title:The Right Way
将在title域中查找"The", 而在默认域(这里是text)中查找"Right"和"Way".
4. 词修饰器 (Term Modifiers)
Lucene支持修饰查询词,以提供一系列的搜索选项。
4.1 通配符搜索 (Wildcard Searches)
Lucene支持在单个查询词内(不是在短语内)的单个或多个字符的通配符搜索。
单个字符匹配使用 "?" 符号。
多个字符匹配使用 "*" 符号。
单个字符的通配符搜索,查找那些只有那一个字符被替代的匹配词。例如,搜索"text"或"test", 你可以使用搜索: te?t
多个字符的通配符搜索,查找零个或多个字符被替代的词。例如,搜索"test", "tests", "tester", 你可以使用搜索: test*
也可以在词中间使用,如果 te*t
注意,"?"或"*"不能作为搜索的第一个字符!
4.2 正则式搜索 (Regular Expression Searches)
Lucene支持匹配两个正斜杠"/"之间的模式,进行正则式搜索。语法可能在版本间有修改,但目前支持的语法文档在RegExp类(org.apache.lucene.util.automaton.RegExp). 例如,查找包含"moat"和"boat"的文档: /[mb]oat/
------------------------------------------------------
org.apache.lucene.util.automaton.RegExp:
http://lucene.apache.org/core/4_7_2/core/org/apache/lucene/util/automaton/RegExp.html?is-external=true
--------------------------------------------------------
4.3 模糊搜索 (Fuzzy Searches)
Lucene支持基于Damerau-Levenshtein距离算法的模糊搜索。做模糊搜索可以在单词后加上波浪号"~". 例如,搜索一个拼写与"roam"相近的词,使用模糊搜索:
roam~
将搜索找到像foam和roams的词。
一个额外的(可选)参数可指定允许的最大编辑次数。值在0到2之间,例如:
roam~1
如果此参数没有给出,默认值是2次编辑距离。
之前,这里可以使用浮点数。但这个语法被考虑放弃,并将在Lucene5.0版本中移除。
4.4 邻近搜索 (Proximity Searches)
Lucene支持查找指定距离之内的词。做邻近搜索,可以在短语后使用波浪号"~", 例如搜索在10个单词内出现"apache"和"jakarta"的文档,使用搜索:
"jakarta apache"~10
4.5 范围搜索 (Range Searches)
范围查询允许匹配域值在指定的上下界之间的文档。范围查询可以包含或排除上下边界。排序按字典序排列。
mod_date:[20020101 TO 20030101]
这将查找mod_date域值在20020101和20030101之间(包含边界)的文档。注意范围查询不仅仅限于日期字段,也可以在非日期域上使用范围查询:
title:{Aida TO Carmen}
这将查找title在Aida和Carmen(不包含边界)的文档。
方括号表示包含边界值,花括号表示不包含。
4.6 增强搜索词 (Boosting a Term)
Lucene基于查找词提供文档匹配相关度程度。增强某个搜索词(的相关度)使用补字号, "^", 并在搜索词的最后跟随一个增强因子(一个数字),增强因子越高,这个词的相关性就越强。
增加搜索让你可以通过增强文档的词(的相关度)来控制文档的的相关度。 例如,你在搜索:
jakarta apache
并且你想要词"jakarta"的相关度更高,则在词的后面使用^符号并跟随增强因子来增强它(的相关度). 你将输入:
jakarta^4 apache
这将使得包含jakarta词的文档变得更相关。你也可以增强短语,像在这个例子中:
"jakrata apache"^4 "Apache Lucene"
默认情况下,增强因子是1. 虽然增强因子必须是正数,但它可以小于1 (如 0.2).
5. 布尔操作 (Boolean Operators)
布尔操作允许通过逻辑操作来组合词。Lucene支持 AND, "+", OR, NOT 和 "-" 作为布尔操作符。(注意,必须全是大写)
5.1 OR
OR操作符是默认的连接符。意味着如果在两个词之间如果没有布尔操作,OR操作符将被使用。OR操作连接两个词并且查找包含任意一个词的文档。等价于集合的并操作。符号"||"可以用来代替"OR"这个词。
搜索包含"jakarta apache"或"jakarta"的文档,使用查询:
"jakarta apache" jakarta
或
"jakarta apache" OR jakarta
5.2 AND
AND操作匹配两个词同时在文本中存在的文档。等价于集合的交集。符号"&&"可以用来代替"AND"这个词。
搜索包含"jakarta apache"和"jakarta"的文档,使用查询:
"jakarta apache" AND jakarta
5.3 +
"+"或着说 包含操作符要求"+"后跟随的词必须在文档的域中出现。
搜索必须包含"jakarta",并且可能包含"lucene"的文档,使用查询:
+jakarta lucene
5.4 NOT
NOT操作符排除包含NOT后的词的文档。等价于集合的非。符号"|"可以用来代替"NOT"这个词。
搜索包含"jakarta apache"但不包含"Apache Lucene"的文档,使用查询:
"jakarta apache" NOT "Apache Lucene"
注意,NOT操作符不能使用在单个词前面(没有意义)。例如,下面的搜索将没有返回结果:
NOT "jakarta apache"
5.5 -
"-" 或者说排除操作符排除包含"-"后的词的文档。
搜索包含"jakarta apache"但不包含"Apache Lucene"的文档,使用查询:
"jakarta apache" -"Apache Lucene"
6. 分组 (Grouping)
Lucene支持使用圆括号组织语句来构成子查询。如果你想控制一个查询的布尔逻辑,这非常有用。
搜索包含"jakarta"或"apache", 和"website", 使用查询:
(jakarta OR apache) AND website
这消除了歧义,并且确保website必须存在,而且jakarta或apache之一可能存在。
7. 域内分组 (Field Grouping)
Lucene支持对某个单独的域使用圆括号来组织多个(查询)语句。
搜索标题中同时包含词"return"和短语"pink panther"的文档,使用查询:
title:(+return +"pink panther")
8. 跳过特殊字符 (Escaping Special Characters)
Lucene支持跳过构成查询语法的特殊字符。当前的特殊字符列表为:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
为了忽略这些字符,可在这些字符前使用"\". 例如,搜索 (1+1):2, 使用查询:
\(1\+1\)\:2
Lucene Query Parser Syntax相关推荐
- 【lucene】Lucene 自定义 Parser
1.概述 有时候需要我们扩展一些Parser来实现或者限制一些功能. 原因: 对于某些QueryParser ( FuzzyQuery,WildcardQuery)在查询时会使得性能降低,所以考虑将这 ...
- Solr所有的查询解析器Query Parsers(转:http://blog.csdn.net/jiangchao858/article/details/53859731)
摘要: Solr除了支持常见的解析器之外,还有一些特殊用途的解析器,为了便于之后查阅,总结一下.本文整理自Solr官方文档. 解析器 说明 Standard Query Parser Solr的标准查 ...
- Solr笔记--转载
Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持层面搜索.命中醒目显示和多种输出格式.在这篇分两部分的文章中,Lucene Java™ 的提交人 Grant Ingersoll ...
- Solr Searching(一)
In this chapter, you are going to learn about: • Request handlers • Query parameters • S ...
- 【solr专题之二】配置文件:solr.xml solrConfig.xml schema.xml
1.关于默认搜索域 If you are using the Lucene query parser, queries that don't specify a field name will use ...
- cloudant_多租户服务的Cloudant最佳做法
IBM于2014年2月收购了Cloudant,从那时起,它已被证明是一个有用的基于文档的存储系统. Cloudant提供了直观的仪表板,其中包含管理大数据所需的许多工具,并且各种客户端库使在自己的应用 ...
- lob 索引 oracle,解决了困惑已久的Oracle全文索引问题
最终选用了ctxcat索引,因为建context索引的时候出现了以下错误 ERROR at line 1: ORA-29855: error occurred in the execution of ...
- Elasticsearch 2014年10月简报
1. Elasticsearch Updates 1.1 公布了Kibana 4 Beta 1 和Beta 1.1 Kibana 4不管是在界面的布局,使用配置方法,还是底层绘制图表的方式都与Kiba ...
- Lucene.net: the main concepts
2019独角兽企业重金招聘Python工程师标准>>> In the previous post you learnt how to get a copy of Lucene.net ...
最新文章
- torchvision nms
- 安装ESXI 5.1
- java 调用软键盘_打开软键盘
- linux命令 -- su
- tensorFlow13卷积神经网络发展
- location的hash部分和使用window.onhashchange实现ajax请求内容时使用浏览器后退和前进功能...
- GET POST方法长度限制
- 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
- 深入探讨一下如何打断点
- OpenShift 4 - DevSecOps Workshop (13) - 将镜像推送到Quay,并进行漏洞扫描
- 查询两个表合并成一个表
- B站手动蹦迪,音效十根柱子31 62 125 250 500 1K 2K 4K 8K 16K怎么调
- vue中dom元素和组件的获取
- 照片视频拼接软件哪个好?一半图片一半视频的快速上手教程,朋友圈超吸赞效果
- 命令行排序文件夹大小
- 如何下载网页中的视频成mp4格式
- SAS实验2——假设检验
- 身份实名认证API开发文档
- Github Actions实现自定义编译OpenWRT固件和第三方插件
- 1+xbim证书含金量_bim证书哪个含金量高
热门文章
- CCNP路由实验之十一 IPv6 (8月5号账号被盗,乱发博文深表抱歉,感谢客服帮忙取回密码)
- qt QGraphicsItem自绘鼠标形状
- ​力扣解法汇总648-单词替换
- springboot导出富文本框数据到word
- Mac中python程序打包成mac-App应用程序
- Web3.0世界知识体系分享-Web3.0基本载体(NFT)
- 代码操作redis集群报错:(error) MOVED 解决方法
- RabbitMQ中重试机制的坑
- 7-3 汉诺塔 (20 分)
- Win10使用自带工具屏幕录制