System.out.printIn(\query = parser.parse(\System.out.printIn(\)
该程序会产生如下输出:. fuzzy: subject:kountry~0.5 fuzzy 2: subject:kcountry~0.7
同样的性能可以揭示:使用通配符查询(WildcardQuery)和使用模糊査询是一致 的,它们还可以通过自定义方式禁止运行,具体可以参考[1]6.3.2小节。
3.3.7 MatchAIIDocsQuery
当输人*:*后,QueryParser 会生成 MatchAIIDocsQuery。
这个操作会将QueryParser所产生的所有Lucene核心査询类型进行包装。但这并 不是QueryParser的一切:它还支持一些非常实用的Query子句分组语法、加权子句以及将子句限制在特定的域上。
3.3.8 分组查询、域选择与加权
使用小括号建立子查询。创建查询时,默认的域名是创建QueryParser时提供的。使用 field:key可将搜索范围限定在某一个具体域,也可以使用field(a b c)的形式将三个项的查询以逻辑OR的形式连接起来。
在浮点数前面附上一个^符号可以对查询处理进行加权因子的设置。举例来说,查询表达式junit^2.0 testing会将junit TermQuery的加权系数设置为2.0,并维持 testing TermQuery的默认加权系数1.0。你可以对任何类型的查询进行加权,这其中包括插入的组。
ANTLR和JFlex项目可提供高于QueryParser能力的语法和功能。
4. 分析器与分析过程
对于Lucene核心来说,分析操作会出现在两个时间点:建立索引期间和使用QueryParser对象进行搜索时。在搜索结果中高亮显示被搜索内容时,也可能要用到分析操作。
几个内置分析器的解析示例如下:
4.1内置分析器说明
? WhitespaceAnalyzer:顾名思义,该分析器通过空格来分割文本信息,而并不
对生成的语汇单元进行其他的规范化处理.
? SimpIeAnalyzer:该分析器会首先通过非字母字符来分割文本信息,然后将语
汇单元统一为小写形式。需要注意的是,该分析器会去掉数字类型的字符, 但会保留其他字符。
? StopAnalyzer:该分析器功能与SimpIeAnalyzer类似.区别在于,前者会去除常
用单词.在默认情况下,它会去除英文中的常用单词(如the、a等),但你也可以根据需要自己设置常用单词.
? StandardAnalyzer:这是Lucene最复杂的核心分析器。基于JFlex-based语法
操作。它包含大量的逻辑操作来识别某些种类的语汇单元,比如公司名称、E-mail地址以及主机名称等. 它还会将语汇单元转换成小写形式,并去除停用词和标点符号.
详见[1] 第4.3节
在真正应用中,一般创建自己的分析器链。这需要自己扩展TokenFilter和Analyzer,一个例子见[1]4.4同音词,4.5同义词处理,4.6词干分析
4.2 分析过程简述
更多描述见[1]第四章
创建IndexWriter后,即为文档选择了默认的分析器。若某个文档需要使用特殊的分析器时,addDocument方法和updateDocument方法都可以选择对应的分析器。为了确保文本信息被分析器处理,可以在创建域时指定Field.Index.ANALYZED
或者Field. Index.ANLYZED_NO_NORMS参数。若需要将整个域值作为一个语汇单元处 理,如图 4.1 中 Field 3 所示,则可以将 Field. Index.NOT_ANALYZED 或 Field. Index. NOT_ANALYZED_NO_NORMS作为第4个参数传人该域。 Analyzer通过TokenStream类将文本逐字转换为语汇单元流。
语汇单元是分析过程产生的基本段元,携带文本值和其他一些元数据。[1]P111 项(term),位置增量(position-Increment)、 偏移量(offset)、类型(type)、标志位(flags)和有效负载。位置增量为0通常用于插入同义词或其他类似信息。
如:
public TokenStream tokenStream{String fieldName, Reader reader) { return new StopFilter{true,
new LowerCaseTokenizer(reader), stopWords); )
过滤顺序对分析过程的影响很重要。[1]P121