Lucene Query Parser
翻译这篇文章的初衷是希望能更系统的理解Lucene的用法,同时试试自己的翻译水平:)
原文:http://jakarta.apache.org/lucene/docs/queryparsersyntax.html
概述
虽然Lucene提供的API允许你创建你自己的Query(查询语句),但它同时也通过Query Parser(查询分析器)提供了丰富的查询语言。
这个页面提供的是Lucene的Query Parser的语法介绍:一个可通过用JavaCC把一个字符串解释成为Lucene的查询语句的规则。
在选择使用被提供的Query Parser前,请考虑一下几点:
1、如果你是通过编写程序生成一个查询语句,然后通过Query Parser分析,那么你需要认真的考虑是否该直接利用Query的API构造你的查询。换句话说,Query Parser是为那些人工输入的文本所设计的,而不是为了程序生成的文本。
2、未分词的字段最好直接加到Query中,而不要通过Query Parser。如果一个字段的值是由程序生成的,那么需要为这个字段生成一个Query Clause(查询子句)。Query Parser所用的Analyzer是为转换人工输入的文本为分词的。而程序生成的值,比如日期、关键字等,一般都由程序直接生成(?)。
3、在一个查询表单里,通常是文本的字段应该使用Query Parser。所有其他的,比如日期范围、关键字等等,最好是通过Query API直接加入到Query中。一个有有限个值的字段,比如通过下拉表单定义的那些,不应该被加到查询字串中(后面会分析到),而应该被添加为一个TermQuery子句。
分词
一个查询语句是有分词和操作符组成的。这里有两种类型的:单个的分词和短语。
一个单一分词就是一个简单的单词,比如”test”或”hello”。
一个短语就是一组被双引号包括的单词,比如”hello dolly”。
多个分词可以用布尔操作符组合起来形成一个更复杂的查询语句(下面会详细介绍)。
注意:用于建立索引的分析器(Analyzer)将被用于解释查询语句中的分词和短语。因此,合理的选择一个分析器是很重要的,当然这不会影响你在查询语句中使用的分词。
字段
Lucene支持字段数据。当执行一个搜索时,你可以指定一个字段,或者使用默认的字段。字段的名字和默认的字段是取决于实现细节的。
你可以搜索任何字段,做法是输入字段名称,结尾跟上一个冒号 “:” , 然后输入你想查找的分词。
举个例子,让我们假设Lucene的索引包含两个字段,标题和正文,正文是默认字段。如果你想标题为 “The Right Way” 并且正文包含文本 “don’t go this way”的记录的话,你可以输入:
title:”The Right Way” AND text:go
或者
title:”Do it right” AND right
由于正文是默认字段,所以字段指示就没有必要了。
注意:字段的搜索值只能是紧跟在冒号后的一个分词,所以搜索字串:
title:Do it right
只会找到标题含有 “Do” 的记录。它会在默认字段(这里是正文字段)里查找 “it” 和 “right”。
分词修饰语
Lucene支持对查询分词做修饰以提供一个更广的查询选项。
通配符搜索
ucene支持一个或多个字符的通配符搜索。
执行一个字符的通配符搜索可以用 “?”,比如你要搜索 “text” or “test” ,你可以用:
te?t
执行多个字符的通配符搜索可以用 “*”,比如,搜索 “test” , “tests” 或 “tester” ,你可以用
test*
你也可以把通配符放在分词中将进行搜索,比如
te*t
注意:不可以使用 * 或 ? 作为搜索字串的第一个支付。
模糊搜索
Lucene支持基于Levenshtein Distance(一种字符串相似程度算法)或Edit Distance(一种字符串相似程度算法)算法的模糊查询。要执行模糊查询需要用到 “~” 符号,紧随单个分词。比如,用模糊查询搜索一个拼写上和 “roam” 类似的内容:
roam~
这个搜索可以搜索到像 foam 和 roams 这样的分词。
“jakarta apache”~10
近似搜索
Lucene支持根据一个指定的近似程度查找。与模糊搜索类似,在短语的末尾使用 “~” 。
范围搜索
范围搜索可以搜索到那些列的值在被范围搜索所指定的上限和下限之间的记录。范围搜索可以包括或不包括上限和下限。如果不是日期类型的字段,会根据字典的排序来决定上下限。
mod_date:[20020101 TO 20030101]
这个会搜索 mod_date 字段的值在 20020101 和 20030101 之间的,包括上下限。注意,范围搜索不仅仅是为日期字段准备的,你也可以在非日期的字段上使用它:
title:{Aida TO Carmen}
这个会搜索 title 字段的值在 Aida 和 Carmen (根据字典的顺序) 的记录,不包括 Aida 和 Carmen 本身。
包含的范围查询是用方括号指定的 “[” 、 “]” ,而不包含的范围查询是有波形括号指定的 “{” 、 “}”。
提高一个分词的相似度
Lucene提供基于被搜索的分词的匹配文档的相似度这一概念。为了提高一个分词的相似度,可以使用 “^”和一个相似因子(一个数字)跟在需要搜索的分词后面。这个匹配因子越高,这个分词所获得相似度就越高。
提高匹配允许你通过提高分词的相似程度来控制一个文档的相似程度。比如,如果你在搜索
jakarta apache
并且,你希望 “jakarta” 有更高的相似程度,就用让 “^” 和一个匹配因子紧随它。你将输入:
jakarta^4 apache
这样会使包含分词 jakarta 的文档有更高的相似度(Lucene默认是按照相似度对搜索结果排序的,所以带来的直接影响就是该搜索结果文档排位靠前)。你也可以对短语分词提高匹配度,比如:
“jakarta apache”^4 “jakarta lucene”
默认的情况下,匹配因子是1。虽然匹配因子必须是正数,当它可以小于1 (比如 0.2)
布尔操作符
布尔操作符允许分词通过逻辑操作符被组合。Lucene支持 AND, “+”, OR, NOT and “-” 作为布尔操作符(注意:布尔操作符必须全部大写)。
OR
OR操作符是默认的连接操作。这意味着如果没有布尔值在两个分词之间的话,OR操作符将被使用。OR操作符连接两个分词,并且搜索包含任意一个分词的文档。这等价于与集合概念中的并集。 “||” 可以替代 OR。
搜索包含 “jakarta apache” 或者 只是 “jakarta” 的文档使用查询语句:
“jakarta apache” jakarta
或者
“jakarta apache” OR jakarta
AND
AND操作符会匹配那些包含所有分词的文档。这等价与集合概念中的交集。”&&” 可以替代 AND。
搜索既包含 “jakarta apache” 又包含 “jakarta” 的文档使用查询语句:
“jakarta apache” AND “jakarta lucene”
+作为必需操作符,需要 “+” 后的分词必须存在于被搜索文档的某个字段中。
搜索必须含有 “jakarta” 同时可能含有 “lucene” 的文档使用查询语句:
+jakarta apache
NOT
NOT操作符会排除包含NOT后的分词的文档。这等价于集合概念中的补集。”!” 可以替代 NOT。
搜索包含”jakarta apache” 但不包含 “jakarta lucene”的文档使用查询语句:
“jakarta apache” NOT “jakarta lucene”
注意:NOT操作符不能只和一个分词一起使用,下面这个查询不会返回任何结果:
NOT “jakarta apache”
“-“作为禁止操作符将不匹配包含”-“所跟随的分词的文档。
搜索包含”jakarta apache” 而不包含 “jakarta lucene” 使用查询语句:
“jakarta apache” -“jakarta lucene”
分组
Lucene支付使用圆括号把子句分组形成子查询。如果你想控制一个查询语句的布尔逻辑,那么这个将非常有用。
查找包含 “jakarta” 或者 “apache” , 同时包含 “website” 使用查询语句:
(jakarta OR apache) AND website
这个将会排除任何混淆,并确定被搜索的文档必须包括 website 这个分词并且包括 jakarta 或者 apache 中的一个。
字段分组
Lucene支持针对单一字段使用圆括号对多个子句分组。
要搜索一个标题既包含分词”return” , 又包含短语 “pink panther” 使用查询语句:
特殊字符转换
作为查询语法的一部分,Lucene支持特殊字符。当前特殊支付包括:
+ – && || ! ( ) { } [ ] ^ ” ~ * ? : \
要转化一个特殊字符,就在要转化的字符前加上 “\” , 例如,搜索 (1+1):2 使用查询语句:
\(1\+1\)\:2
原文:http://jakarta.apache.org/lucene/docs/queryparsersyntax.html