lucene学习(5)

2019-03-03 11:36

3.2.6通过短语搜索:PhraseQuery类

索引时如果不用omitTermFreqAndPositions选项(详见[1]2.4.1小节)建立纯Boolean 域的话,索引会根据默认设置包含各个项的位置信息。PhraseQuery类会根据这些位置信息定位某个距离范围内的项所对应的文档。例如,假设某个域中包含短语“the quick brown fox jumped over the lazy\即时我们不知道这个短语的完整写法,也一样可以通过 查找域中quick和fox相关并且相距很近的文档。当然,一个简单的TermQuery类也能够通 过对这两个项的单独査询而找到同样的文档,但在该例中,我们仅仅希望査到域中quick紧 邻fox (quick fox)的或者两者之间只有一个单词(quick [其他单词]fox)的文档。

在匹配的情况下,两个项的位置之间所允许的最大间隔距离称为slop。这里的距离是指项若要按顺序组成给定的短语所需要移动位置的次数。 public class PhraseQueryTest extends TestCase { private Directory dir;

private IndexSearcher searcher;

protected void setup() throws IOException { dir = new RAMDirectory();

IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer{),

IndexWriter.MaxFieldLength.UNLIMITED); Document doc = new Document(); doc.add(new Field(\

\Field .Store. YES , Field.Index.ANALYZED)); writer.addDocument(doc); writer.close();

searcher = new IndexSearcher(dir); )

protected void tearDown() throws IOException {

searcher.close(); dir.close(); }

private boolean matched(String[] phrase, int slop) throws IOException { PhraseQuery query = new PhraseQuery(); query.setSlop(slop);

//初始化PhraseQuery对象

for (String word : phrase) {

query.add (new Term(\}

TopDocs matches = searcher.search(query, 10) ; return matches.totalHits > 0; } }

如果进入query的短语顺序不对,则slop需要按移动次数进行调整,后面的移到前面位置,同时前面的也要移到后面位置,所以slop数更多。

PhraseQuery支持复合项短语,slop因子规定了按顺序移动项位置的总次数的最大值。

在QueryParser的分析表达式中,双引号里面的若干个项被转换成一个 PhraseQuery对象.Slop因子的默认值是0,但是你可以在QueryParser的查询表 达式中加上~n声明,以此来调整slop因子的值.例如,表达式“quick fox\的意思为:为fox和quick项生成一个slop因子为3的PhraseQuery对象. 与之相对应 SpanNearQuery能确保按次序的匹配。

3.2.7通配符查询:WildcardQuery 类

通配符查询可以让我们使用不完整的、缺少某些字母的项进行查询,但是仍然可以查到相关匹配结果。Lucene使用两个标准的通配符:*代表0个或者多个字 母,?代表0个或者1个字母。

3.2.8 搜索类似项:FuzzyQuery类

Lucene的模糊查询FuzzyQuery类用于匹配与指定项相似的项。Levenshtein距离算法用来决定索引文件中的项与指定目标项的相似程度(有关Levenshtein距离算法的更多信息请参考http://eitwikipedia. org/wiki/ Levenshtein_Distance)。这种算法又称为编辑距离算法,它是两个字符串之间相似度的一个度量方法,编辑距离就是用来计算从一个字符串转换到另一个字符串所需的最少插入、删除和替换的字母个数。例如,“three”和“tree”两个字符串的编辑距离为1,因为前者只需要删除一个字符它们就一样了。

Levenshtein距离计算不同于PhraseQuery和PhrasePrefixQuery中所使用的距离 计算方法。短语查询距离是为了匹配目标文档短语所需移动项的次数,而Levenshtein 距离则是一个项内部字母移动的次数。

FuzzyQuery通过一个阈值来控制 匹配,而不是单纯依靠编辑距离。这个阈值是通过字符串长度除以编辑距离得到的一个因子。编辑距离能影响匹配结果的评分,编辑距离越小的项所获得的评分就越高。

1?distance

min(textlen,targetlen)该类会尽可能枚举出一个索引中所有项,对程序性能会有所影响。

3.2.9匹配所有文档:MatchAIIDocsQuery 类

MatchAilDocsQuery类,顾名思义,就是匹配索引中所有文档。默认情况下, 该类对匹配的文档分配了一个固定的评分,该文档具体的査询加权默认值为1.0。

如果你将该查询作为顶层查询,那么除了使用默认的相关性排序之外,最好通过域来排序。

对于一些特殊域来说,还可以用MatchAHDocsQuery来为索引中的文档进行评分 加权,操作如下:

Query query = new MatchAHDocsQuery (field);

如果执行这样的操作,文档就会根据该特定域的加权情况而被评分(详见[1]2.5 小节)。

3.3 解析查询表达式:QueryParser

QueryParser使用反斜杠(\\)表示转义字符。需转义的字符有: \\ + - ! ( ) : ^ ] { } ~ * ?

Query 的 toString 方法可以查看构建的复杂查询,也可看到QueryParser对查询的解析结果。

3.3.1 单词查询

单个词的查询相当于TermQuery,被解析为 field:key

3.3.2 范围搜索

范围搜索:中括号表示包含在内;大括号表示排除在外。起止点要么都包含在内,要么都排除在外。文本范围查询会将查询边界转换为小写字母形式,除非程序调用了QueryParser.setLowercaseExtendedTerms(false)。如果起止点内包含空格,则必须用双引号括起来。

3.3.3 前缀查询和通配符查询

当查询包含了星号或问号,就被当做通配符查询对象WildcardQuery。当查询只在末尾有一个星号时,QueryParser将优化为前缀查询对象PrefixQuery。默认查

询对象都会被转化为小写字母形式,解除这一默认值,调用QueryParser.setLowercaseExtendedTerms(false)。要在项开端包含通配符,需要调用setAllowLeadingWildcard方法,同时牺牲一部分性能。

3.3.4 布尔查询

AND OR NOT 必须大写。如果查询项之间没有指定布尔操作符,则默认为OR。程序可改变对隐含操作符的设置。

parser.setDefaultOperator(QueryParser.AND_OPERATOR); NOT操作单独使用将不起作用。

3.3.5 短语查询

查询语句中用双引号扩起来的项可以用来创建一个PhraseQuery。引号之间的文本将被进行分析,作为分析结果,PhraseQuery可能不会跟原始短语一样精确。双引号内的文本会促使分析器将之转换为PhraseQuery,停用词被问号代替,默认Slop因子为0,但可以调用QueryParser.setPhraseSlop()方法来改变这个默认因子,也可以用波浪号(~)和预期的整型slop值来修改。单项短语(single-term phrase)将被优化成TermQuery对象。

3.3.6 模糊查询

波浪符(~)会针对正在处理的项来创建模糊查询。需要注意的是,波浪符还可以用于指定松散短语查询,但具体环境是各不相同的。双引号表示短语查询,它并不能用于模糊査询。你可以选择性指定一个浮点数,用来表示所需的最小相似程度。下面是使用案例:

public void testFuzzyQuery() throws Exception {

QueryParser parser = new QueryParser{Version.LUCENE_30, \;

Query query = parser.parse(\


lucene学习(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:星级酒店餐厅菜单之认识

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: