lucene3短语查找PhraseQuery
用户在搜索引擎中进行搜索时,常常查找的并非是一个简单的单词,很有可能是几个不同的关键字。这些关键字之间要么是紧密相联,成为一个精确的短语,要么是可能在这几个关键字之间还插有其他无关的关键字。此时,用户希望将它们找出来。不过很显然,从评分的角度看,这些关键字之间拥有与查找内容无关短语所在的文档的分值一般会较低一些。
PhraseQuery正是Lucene所提供的满足上述需求的一种Query对象。它的add方法可以让用户往其内部添加关键字,在添加完毕后,用户还可以通过setSlop()方法来设定一个称之为“坡度”的变量来确定关键字之间是否允许、允许多少个无关词汇的存在。
Term:文档中每个域的存储单位,“the quick brown fox jumped over the lazy dog”这个短语中每个单词为一个Term,并且每个Term包含此单词在短语中的位置信息。
slop:在匹配的情况下,两个Term之间允许的最大距离称为slop。距离是指Term按照顺序组成给定的短语,所需要移动位置的次数。
先以”亲亲宝宝网”建立索引,分词时会被分成”亲亲”、”宝宝网”和”宝宝”三个词。
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "field",analyzer);
parser.setPhraseSlop(1); //默认为0
Query query = parser.parse("亲亲宝宝");
当需要查找的关键词能拆分为两个以上时,返回的就是一个PhraseQuery对象,像”亲亲宝宝”分词时会被分成”亲亲”和”宝宝”两个个词,在不设置slop时,查找"亲亲宝宝"返回空,因为索引文件的中间还包含有”宝宝网”,但我们可以设置parser.setPhraseSlop(1);这时就可以查到需要的结果了。
PhraseQuery query = new PhraseQuery();
query.setSlop(1); //可以设置slop
query.add(new Term(‘field’,’亲亲’));
query.add(new Term(‘field’,’宝宝”));
这是直接建立PhraseQuery对象,效果同上面一样,我觉得上面的使用更方便一些。
欢迎转载,请注明出处:亲亲宝宝