`

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

分享到:
评论

相关推荐

    lucene的查询语法事例

    **Lucene查询语法详解** Apache Lucene是一款高性能、全文本搜索库,被广泛应用于各种搜索引擎的构建。在使用Lucene进行信息检索时,理解和掌握其查询语法至关重要。本篇文章将深入探讨Lucene的查询语法,帮助你更...

    Lucene查询语法

    ### Lucene查询语法详解 #### 一、Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,被广泛应用于各种需要实现全文检索的应用场景之中。Lucene支持复杂的查询语法,能够灵活地处理多样化的查询需求,使得...

    lucene文档笔记详解

    **Lucene文档笔记详解** Lucene,源自Apache软件基金会4 Jakarta项目组,是一个备受开发者青睐的开源全文检索引擎工具包。它提供了强大的文本分析、索引构建和搜索功能,但值得注意的是,Lucene本身并不包含完整的...

    Lucene 常用功能介绍视频详解

    它可以处理多种查询语法,如布尔表达式(AND, OR, NOT, XOR)、短语查询、前缀查询、范围查询等。自定义查询构造器也是可能的,以适应特定的查询需求。 4. **搜索** `IndexSearcher`类是执行搜索的核心,它接受`...

    Lucene 实时搜索视频详解

    3. **查询语法**:深入学习 Lucene 的查询语言,包括布尔运算符、短语匹配和范围查询。 4. **性能优化**:探讨如何提升搜索速度,包括内存管理、缓存策略和段合并策略。 5. **实战应用**:通过实例演示如何将 Lucene...

    Lucene 全文检索 之 详解

    **全文检索技术与Lucene详解** 全文检索是一种在大量文本数据中快速查找包含特定词汇或短语的信息的技术。在互联网时代,随着数据量的爆炸性增长,高效、准确的全文检索变得至关重要。Lucene,由Apache软件基金会...

    lucene-core-2.9.4,lucene-core-3.0.2,lucene-core-3.0.3,lucene-core-3.4.0

    《Apache Lucene核心技术详解:从2.9.4到3.4.0的演变》 Apache Lucene,作为开源的全文检索库,是Java开发人员进行高效信息检索的重要工具。这个压缩包文件包含了Lucene从2.9.4版本到3.4.0版本的核心组件,让我们...

    lucene-4.7.0全套jar包

    【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...

    Lucene常用的Demo

    掌握这些基础后,你就可以进一步探索Lucene的高级特性,如近实时搜索、多线程索引、复杂查询语法等。记住,实践是检验理解的最好方式,动手尝试这些示例,结合官方文档,你的Lucene技能将得到显著提升。

    lucene-core-2.4.0.jar

    《Lucene核心技术详解——以lucene-core-2.4.0.jar为例》 Apache Lucene是一个开源全文搜索引擎库,它为开发者提供了强大的文本搜索功能。本文将以“lucene-core-2.4.0.jar”这一特定版本为例,深入探讨Lucene的...

    lucene部分常用代码

    Lucene常用代码详解 Lucene是一款功能强大且高效的搜索引擎,广泛应用于各种搜索应用程序中。为了更好地使用Lucene,需要了解其核心API和常用代码。本文将对Lucene部分常用代码进行详细解释,包括多字段搜索、多...

    Lucene 使用正则表达式

    Lucene的核心特性之一就是支持复杂的查询语言,其中包括正则表达式。 #### 正则表达式在Lucene中的应用 正则表达式是一种强大的文本模式匹配工具,广泛应用于字符串搜索和替换等场景。在Lucene中,可以通过`regexQuery...

    Lucene分词器资源包

    它能将用户的自然语言查询转换为Lucene理解的查询语法,支持各种查询构造,例如布尔查询、短语查询、范围查询等。 4. **Lucene Queries**: `lucene-queries.jar` 包含了Lucene的各种查询类型和相关类,这些类用于...

    lucene-3.0.0

    2. **查询处理**:用户输入查询后,查询解析器会将自然语言转化为 Lucene 可识别的查询语法,然后在索引中查找匹配的文档。 3. **结果排序**:Lucene 使用评分机制(TF-IDF)来评估查询与文档的相关性,根据评分...

    Lucene in Action 2nd

    - **增强的查询语言**:提供更加灵活多样的查询语法,满足复杂查询需求。 - **改进的分词机制**:增强了对不同语言的支持,并引入了更多的分词器选项。 - **扩展的排序功能**:支持基于多个字段或自定义函数的排序...

    Lucene源码

    **Lucene 源码详解** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发,被广泛应用于构建高效的搜索功能。作为一款Java实现的全文搜索引擎架构,Lucene 提供了完整的索引和查询引擎,使得开发者能够快速...

    Lucene组件

    6. **QueryParser**: 查询解析器将用户的自然语言查询转换为Lucene理解的查询语法,支持多种查询构造方式,如布尔运算符、短语查询等。 7. **ScoreDoc**: 当搜索器返回结果时,ScoreDoc对象包含了每个匹配文档的...

    lucene2.0.0

    5. **查询解析**:Lucene支持多种查询语法,如布尔查询、短语查询、范围查询等。查询字符串会被解析成查询对象,然后匹配索引中的数据。 6. **搜索过程**:查询执行涉及查询分析、索引搜索和结果评分。使用TF-IDF...

    lucene-3.6.0

    用户可以通过QueryParser类来构建复杂的查询表达式,3.6.0版本对查询语法进行了优化,提升了查询性能。 3. **分析器(Analyzer)**:分析器负责将输入文本分解为可搜索的词项。Lucene 3.6.0包含了多个预定义的分析...

Global site tag (gtag.js) - Google Analytics