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相关推荐

  1. 【lucene】Lucene 自定义 Parser

    1.概述 有时候需要我们扩展一些Parser来实现或者限制一些功能. 原因: 对于某些QueryParser ( FuzzyQuery,WildcardQuery)在查询时会使得性能降低,所以考虑将这 ...

  2. Solr所有的查询解析器Query Parsers(转:http://blog.csdn.net/jiangchao858/article/details/53859731)

    摘要: Solr除了支持常见的解析器之外,还有一些特殊用途的解析器,为了便于之后查阅,总结一下.本文整理自Solr官方文档. 解析器 说明 Standard Query Parser Solr的标准查 ...

  3. Solr笔记--转载

    Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持层面搜索.命中醒目显示和多种输出格式.在这篇分两部分的文章中,Lucene Java™ 的提交人 Grant Ingersoll ...

  4. Solr Searching(一)

    In this chapter, you are going to learn about: •     Request handlers •     Query parameters •     S ...

  5. 【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 ...

  6. cloudant_多租户服务的Cloudant最佳做法

    IBM于2014年2月收购了Cloudant,从那时起,它已被证明是一个有用的基于文档的存储系统. Cloudant提供了直观的仪表板,其中包含管理大数据所需的许多工具,并且各种客户端库使在自己的应用 ...

  7. lob 索引 oracle,解决了困惑已久的Oracle全文索引问题

    最终选用了ctxcat索引,因为建context索引的时候出现了以下错误 ERROR at line 1: ORA-29855: error occurred in the execution of ...

  8. Elasticsearch 2014年10月简报

    1. Elasticsearch Updates 1.1 公布了Kibana 4 Beta 1 和Beta 1.1 Kibana 4不管是在界面的布局,使用配置方法,还是底层绘制图表的方式都与Kiba ...

  9. Lucene.net: the main concepts

    2019独角兽企业重金招聘Python工程师标准>>> In the previous post you learnt how to get a copy of Lucene.net ...

最新文章

  1. torchvision nms
  2. 安装ESXI 5.1
  3. java 调用软键盘_打开软键盘
  4. linux命令 -- su
  5. tensorFlow13卷积神经网络发展
  6. location的hash部分和使用window.onhashchange实现ajax请求内容时使用浏览器后退和前进功能...
  7. GET POST方法长度限制
  8. 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
  9. 深入探讨一下如何打断点
  10. OpenShift 4 - DevSecOps Workshop (13) - 将镜像推送到Quay,并进行漏洞扫描
  11. 查询两个表合并成一个表
  12. B站手动蹦迪,音效十根柱子31 62 125 250 500 1K 2K 4K 8K 16K怎么调
  13. vue中dom元素和组件的获取
  14. 照片视频拼接软件哪个好?一半图片一半视频的快速上手教程,朋友圈超吸赞效果
  15. 命令行排序文件夹大小
  16. 如何下载网页中的视频成mp4格式
  17. SAS实验2——假设检验
  18. 身份实名认证API开发文档
  19. Github Actions实现自定义编译OpenWRT固件和第三方插件
  20. 1+xbim证书含金量_bim证书哪个含金量高

热门文章

  1. CCNP路由实验之十一 IPv6 (8月5号账号被盗,乱发博文深表抱歉,感谢客服帮忙取回密码)
  2. qt QGraphicsItem自绘鼠标形状
  3. ​力扣解法汇总648-单词替换
  4. springboot导出富文本框数据到word
  5. Mac中python程序打包成mac-App应用程序
  6. Web3.0世界知识体系分享-Web3.0基本载体(NFT)
  7. 代码操作redis集群报错:(error) MOVED 解决方法
  8. RabbitMQ中重试机制的坑
  9. 7-3 汉诺塔 (20 分)
  10. Win10使用自带工具屏幕录制