注意:使用QueryParser查询,关键词是会被分词的,如果不需要分词,可以选择使用Lucene提供的API查询类。

Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Query Parser提供的强大的查询语法解析来构造你想要的查询器。本文章详细的介绍了Lucene的查询语法。通过Java语法分析器把一个查询字符串解析成 Lucene的查询器。在你选择使用Query Parser前,请考虑以下事项:

如果你打算在程序中拼接查询语法串然后再利用Query Parser转换,那么强烈建议你利用相应的API来自己构造查询器。也就是说,Query Parser是为手工输入高级查询设计的,而不是为程序拼接语法串而设计的。不分词的字段也最好通过相应的API添加到查询器中,而不是通过Query Parser。Query Parser 使用的Analyser分析器,作用是将用户手工输入的文本转化为相应的Term。如果一个字段的值是通过程序生成的(例如日期字段,关键词字段等),那 么在查询的时候也应该保持前后一致,利用程序生成相应的格式来查询。

在查询的目标中,如果字段全部是程序生成的文本,(例如补齐的日期字段等),最好使用Query Parser以便查询的时候也是一致的格式。至于其它的,例如日期范围查询,关键字查询等,最好调用相应的API来构建查询器。目标字段中如果仅仅拥有有 限的枚举值时,最好通过下拉列表提供给用户选择,然后利用TermQuery添加到查询器中,而不是而其拼接到查询字符串然后利用Query Parser来解析。

Terms 
一个查询将分解为若干Term以及操作符,有两种Term,其一是单一Term,其二为短语。单一Term是经过分析器分词后的最小单元,他就是一个简单 的词,例如“Test”和“Hello”。短语则是一组被双引号括起来的一组词,例如:“Hello dolly”,多个Term可以通过布尔操作合并在一个更加复杂的查询器中。
注意:一般来说,创建索引的分析器和查询的分析器最好保持一致(当然也有特殊情况,比如单字索引,分词组合查询),所以选择一个不会干扰查询词的分析器是很重要的。

Fields 
Lucene支持多字段数据,当你在查询的时候你可以指定一个字段查询,也可以使用默认的字段。你可以使用 字段名 + “:” + 查询词来指定字段名搜索。举个例子,让我们假定Lucene的索引中含有两个字段,Title字段和Text字段,其中Text字段是默认字段,当你想找 到一篇文档其中标题包含“The Right Way”同时文本中包含“go”,你可以输入:
title:"The Right Way" AND text:go 
或者:
title:" The Right Way " AND go 
如果字段是默认字段的话,在查询语法中可以不需要显式指定。注意,使用默认字段有可能会造成如下的结果:
title:Do it right 
以上查询将查找标题中含有“Do”,Text字段字段中含有“it”和“right”的文档,因为Text是默认字段,所以如果想要查找Title中完整包含的很用引号引起来。

二、模糊查询
Term Modifiers
Lucene支持在Term中使用通配符来支持模糊查询。

Wildcard Searches [类:org.apache.lucene.search.WildcardQuery]
Lucene支持单个或者多个字符的通配符查询,匹配单一字符使用符号“?”,匹配多个字符使用符号“*”。
“?”通配符将查找所有满足通过一个字符替换后符合条件的文档。比如:搜索“test”和“text”你可以使用:
te?t 
“*”通配符将查询0个或者多个字符替换后符合条件的。举例来说,查询test,tests或者tester,你可以使用一下字符串来搜索:
test*
当然,你也可以将“*”放在字符的中间
te*t 
注意:你不能将“*”和“?”放在第一个字符来查询。(Lucene应该是出于性能考虑,所以不支持该功能)

Fuzzy Searches [org.apache.lucene.search.FuzzyQuery]
Lucene支持基于编辑距离算法的模糊搜索,你可以使用波浪符号“~”放在查询词的后面,比如搜索一个与“roam”拼写相近的词可以使用:
roam~ 
该查询将寻找类似“foam”和“roams”等的词语。也可以说是相似度查询。

Proximity Searches [org.apache.lucene.search.PrefixQuery]
Lucene支持指定距离查询,你可以使用波浪号“~”加数字在查询词后。举例来说搜索“apache”和“jakarta”距离10个字符以内,你可以使用如下语法:
"jakarta apache"~10 
通过这个语法支持,我们可以单字索引,分词查询,分词完后,满足每个词的单字必须间距为1。这样可以保证100%的召回率,但是在索引方面将造成索引臃肿,同时查询速度也将在某程度上降低,一般来说,在150W文章数据到200W数据的时候性能将会明显的降低。

Range Searches [org.apache.lucene.search.RangeQuery]
范围查询允许你指定某个字段最大值和最小值,查询在二者之间的所有文档。范围查询可以包含或者不包含最大值和最小值,排序是按照字典顺序来排序的。
mod_date:[20020101 TO 20030101] 
这个将查找满足mode_date字段在大于等于20020101,小于等于20030101范围的所有文档,注意:范围查询并不是为日期字段专设的,你也可以对非日期字段进行范围查询。
title:{Aida TO Carmen} 
这个将查找所有标题在Aida和Carmen之间但不包含Aida和Carmen的文档。包含最大值和最小值的查询使用方括号,排除则使用花括号。

三、优先级
Boosting a Term 
Lucene支持给不同的查询词设置不同的权重。设置权重使用“^”符号,将“^”放于查询词的尾部,同时跟上权重值,权重因子越大,该词越重要。设置权重允许你通过给不同的查询词设置不同的权重来影响文档的相关性,假如你在搜索:
jakarta apache 
如果你认为“jakarta”在查询时中更加重要,你可以使用如下语法:
jakarta^4 apache 
这将使含有Jakarta的文档具有更高的相关性,同样你也可以给短语设置权重如下:
"jakarta apache"^4 "jakarta lucene" 
在默认情况下,权重因子为1,当然权重因子也可以小于1。

四、Term操作符
Boolean operators 
布尔操作符可以将多个Term合并为一个复杂的逻辑查询。Lucene支持AND,
+,OR,NOT, -作为操作符号。注意,所有的符号必须为大写。

OR 
OR操作符默认的连接操作符。这意味着,当没有给多个Term显式指定操作符时,将使用OR,只要其中一个Term含有,则可以查询出文档,这跟逻辑符 号||的意思相似。假设我们查询一个文档含有“jakarta apache”或者“jakarta”时,我们可以使用如下语法:
"jakarta apache" jakarta 
或者
"jakarta apache" OR jakarta

AND 
AND操作符规定必须所有的Term都出现才能满足查询条件,这跟逻辑符号&&意思相似。如果我们要搜索一个文档中同时含有“jakarta apache”和“jakarta lucene”,我们可以使用如下语法:
   "jakarta apache" AND "jakarta lucene"

+
+操作符规定在其后的Term必须出现在文档中,也就是查询词中的MUST属性。举个例子来说,当我们要查询一个文档必须包含“jakarta”,同时可以包含也可以不包含“lucene”时,我们可以使用如下语法:
+jakarta apache

NOT 
NOT操作符规定查询的文档必须不包含NOT之后的Term,这跟逻辑符号中的!相似。当我们要搜索一篇文档中必须含有“jakarta apache”同时不能含有“Jakarta lucene”时,我们可以使用如下查询;
"jakarta apache" NOT "jakarta lucene" 
注意:NOT操作符不能使用在单独Term中,举例来说,以下查询将返回无结果:
NOT "jakarta apache"


-操作符排除了包含其后Term的文档,跟NOT有点类似,假设我们要搜索“Jakarta apache”但不包含“Jakarta lucene”时,我们使用如下语法:
"jakarta apache" -"jakarta lucene"

Grouping 
Lucene支持使用圆括号来将查询表达式分组,这将在控制布尔控制查询中非常有用。举例来说:当搜索必须含有“website”,另外必须含有“jakarta”和“apache”之一,我们可以用如下语法:
(jakarta OR apache) AND website 
这种语法对消除歧义,确保查询表达式的正确性具有很大的意义。

Field Grouping 
Lucene支持对字段用圆括号来进行分组,当我们要查询标题中含有“return”和“pink ranther”时,我们可以使用如下语法:
title:(+return +"pink panther")

Escaping Special Characters 
Lucene支持转义查询中的特殊字符,以下是Lucene的特殊字符清单:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
转义特殊字符我们可以使用符号“\”放于字符之前。比如我们要搜索(1+1):2,我们可以使用如下语法:
\(1\+1\)\:2

Tips: QueryParser.escape(q)  可转换q中含有查询关键字的字符!如:* ,? 等

英文原文地址:http://lucene.apache.org/java/2_4_0/queryparsersyntax.html

修改自:http://hi.baidu.com/expertsearch/blog/item/8d4f7d355a2e413c5ab5f547.html

转自:https://www.oschina.net/question/1092_560

转载于:https://www.cnblogs.com/hihtml5/p/6479582.html

lucene查询解析器语法相关推荐

  1. eDisMax查询解析器

    DisMax扩展(eDisMax)查询解析器是DisMax查询解析器的升级版.除了支持所有DisMax查询解析器参数外,还扩展了DisMax: 支持完整的Lucene的查询分析器语法. 支持查询,例如 ...

  2. 标准查询分析器:Solr的默认查询解析器也称为“Lucene”解析器。

    标准查询分析器:Solr的默认查询解析器也称为"Lucene"解析器. 标准查询解析器的主要优点是,它支持一种健壮且相当直观的语法,允许您创建各种结构化查询.最大的缺点是,与设计为 ...

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

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

  4. mysql 存储引擎接口_MySQL 的基础一(连接池, SQL接口, 查询解析器, 查询优化器, 存储引擎接口, 执行器,)...

    MySQL数据库的连接池 现在我们已经知道,我们任何一个系统都会有一个数据库连接池去访问数据库,也就是说这个系统会有多个数据库连接,供多线程并发的使用.同时我们可能会有多个系统同时去访问一个数据库,这 ...

  5. 查询中接受的主体参数_Apollo入门引导(三):编写查询解析器

    接上篇 -- Apollo 入门引导(二):连接数据源 -- 继续翻译 Apollo 的官网入门引导. 学习 GraphQL 的查询是如何获取数据的. Apollo 入门引导 - 目录: 介绍 构建 ...

  6. lucene 查询示例_高级Lucene查询示例

    lucene 查询示例 本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解Lu ...

  7. 高级Lucene查询示例

    本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式 ...

  8. Go语言写的解析器(支持json,linq,sql,net,http等)

    Monkey程序语言 Monkey v2.0版本已发布. monkey v2.0 增加了如下内容: 新增 short arrow(->)支持(类似C#的lambda表达式) 增加 列表推导和哈希 ...

  9. sqlparser mysql_SQL语法解析器JSQLParser | IT瘾

    相关 [sql 语法 解析器] 推荐: SQL 语法解释器jsqlparser. 是用java 开发的解析器, 可以生成java类层次结构.. 可以完美解析 表的 增删查改等操作.. 展开它的源码你会 ...

最新文章

  1. linux shell输出数字小数点前少了0_南京课工场IT培训:SHELL 超详细基础知识,适合新手小白(一)
  2. bom中的event以及一些window的API
  3. 初步了解超图桌面版导入CityGML数据
  4. springboot集成shiro实现注册、登录、退出功能
  5. Android开发技术周报 Issue#52
  6. 2021 .NET 开发者峰会顺利在网上落幕,线上直播回看汇总
  7. C语言 strcpy函数实现
  8. 以post方式携窗体等参数向服务器发送请求 发出去的字节流 返回的内容
  9. 13篇京东CVPR 2019论文!你值得一读~
  10. 如何快速打好java基础_学习Java课程时如何才能打好基础呢?
  11. git提交时发现iml文件没有被排除
  12. 黑龙江省2021高考成绩排名查询,黑龙江高考排名对应学校-高考位次对应大学(2021年理科参考)...
  13. win8安装mysql出现2503_win8.1安装msi文件出现2503错误的解决方法
  14. Java实现模拟银行系统
  15. Angular4+ 页面切换 显示进度条
  16. 吉利汽车:数字化转型从上云开始
  17. SPSS26版本软件超详细安装指导+内附安装资源
  18. flash for linux安装教程,Flash Player 9 FOR Linux 的安装
  19. 学大数据需要具备四种条件?你具备几种?
  20. Monaco Editor教程(十八):使用api来完成某些键盘操作,格式化,查找,显示右侧菜单等。

热门文章

  1. python课程设计的主要任务_Python课程设计:微课视频版
  2. 【图论】图的定义和术语
  3. Windows Server 2008简介
  4. 基于51单片机的红外线测距仿真
  5. 文字识别中CTC损失的直觉解释
  6. 修改windows系统网卡的MAC地址方法
  7. 如何使用老毛桃重装系统和镜像系统
  8. html语言简介 ppt,html课件ppt
  9. 直播技术的祖师爷是谁?| 历史上的今天
  10. Linux下spi驱动分析与测试【详细流程】