lucene查询解析器语法

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

时间: 2024-10-25 15:42:19

lucene查询解析器语法的相关文章

Solr查询解析器大全

一.字段查询解析器 字段查询解析器在指定字段中搜索词项或短语,可以使用该字段定义的任何文本分析方式.f参数指明要进行词项或短语搜索的字段,语法如下: {!field f=myfield}hello world 该语法与使用Lucene查询解析器搜索短语myfield:"hello world"是等价的. 二.词项查询解析器和原始查询解析器 词项查询解析器可以直接在Solr索引上进行检索,但不能使用字段上定义的文本分析方法.这是它与字段查询解析器的不同之处.词项查询解析器可以对分面搜索返

kotlin 写的一个简单 sql 查询解析器

1 package com.dx.efuwu.core 2 3 import org.apache.commons.lang.StringUtils 4 import java.sql.PreparedStatement 5 6 /** 7 * sql 模板处理 8 * @author sunzq 9 * 2017/06/02 10 */ 11 12 /** 13 * 查询的一个条件句 14 */ 15 class QueryBranch(val content: String, val key

Lucene学习:lucene查询

1.1. Lucene查询 在学习Lucene的查询方法前,先了解一下下面几个类: 1.1.1. Query 封装某种查询类型的具体子类,配置查询的查询条件.Query实例将被传递给IndexSearcher的search方法.下面是常用的Query子类: l 通过项进行搜索 TermQuery类 l 在指定的项范围内搜索 TermRangeQuery类 l 通过字符串搜索 PrefixQuery类 l 组合查询 BooleanQuery类 l 通过短语搜索 PhraseQuery类 l 通配符

lucene查询索引之解析查询——(八)

0.语法介绍: 1.公共部分代码同七中一样 // IndexReader IndexSearcher public IndexSearcher getIndexSearcher() throws Exception { // 第一步:创建一个Directory对象,也就是索引库存放的位置. Directory directory = FSDirectory.open(new File("E:\\lucene&solr\\index"));// 磁盘 // 第二步:创建一个ind

MySQL技术探索01实现SQL语法解析器

本文将介绍如何使用开源的语法和词法分析框架bison和flex来实现SQL解析器.出于技术学习的目的,本文做描述的微型SQL解析器仅能实现对微型SQL的语法解析. 1.MySQL中的SQL解析器 包括JDBC.ODBC.ADO等等关系数据库客户端应用开发框架在内的各种SDK,核心功能是帮助程序员简化各种客户端的数据库操作,同时将SQL语句通过网络形式发送给MySQL等关系数据库的服务器进程.MySQL服务器进行负责解析并执行这些SQL语句.SQL语句中的语法规则多种多样,MySQL服务器是如何实

工作中的那些坑(2)——语法解析器

工作项目里用到线性回归算法,用于计算账户的分值,表明某账户是否是有风险的账户.其中参数都配好了,代码里直接用逆波兰表达式解析即可.本来事情到这里已经结束,突然来了新的需求:账户算出来的分数较为无序,于是考虑用sigmoid函数将其映射到(0,1)区间内,在乘以系数使其显示更为直观.为了使整个表达式更将通用,要求做到同时能解析sigmoid函数,即:原来单纯解析常量.变量.运算符的逆波兰表达式已经不能直接解析新增的sigmoid函数(即表达式),另外对嵌套的情况也没做处理,所以需要重新设计一个更为

语法解析器!

举例:将i = a + b * c作为源代码输入到解析器里,则广义上的解析器的工作流程如下图:   发表时间:2009-10-17           最后修改:2011-03-04 <         >              猎头职位: 上海: Senior Software Engineer 相关文章: 深入理解JVM 透过JVM看Exception本质 历史篇:Java虚拟机家族考 推荐群组: 高级语言虚拟机               更多相关推荐 编程综合 (Disclaime

Lucene查询语法详解

Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 词语查询(Terms) 单词,例如:"test","hello" 语句,例如:"hello,world!" 字段查询(Field) title:hello 或者 title:"hello title" //搜索title为 hello title关键字的文档 title:hello title //搜索title为hello,或者

Python 之父的解析器系列之五:左递归 PEG 语法

原题 | Left-recursive PEG grammars 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众号作者) 声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议.为便于阅读,内容略有改动. 我曾几次提及左递归是一块绊脚石,是时候去解决它了.基本的问题在于:使用递归下降解析器时,左递归会因堆栈溢出而导致程序终止. [这是我的 PEG 系列的第 5 部分.其它文章参见这个目录] 假设