我在短语查询方面遇到了一些问题,所以编写一个小代码来准确了解短语查询实际上如何与slop一起使用:
我有一个字符串“abc技术学院”,我索引了这个字符串的不同组合(更像是一个木瓦),像这样
Document doc = new Document();
ArrayList<String> sh = new ArrayList<String>();
sh.add("abc institute engineering technology");
sh.add("abc institute engineering");
sh.add("abc institute");
sh.add("abc");
sh.add("institute engineering technology");
sh.add("institute engineering");
sh.add("institute");
sh.add("engineering technology");
sh.add("engineering");
sh.add("technology");
for(String s : sh){
doc.add(new Field("insti_shingles", s.toLowerCase(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
}
writer.addDocument(doc);
现在当我从索引目录中读取所有令牌时,我有这些令牌集:
engineering technology
abc
institute
abc institute engineering technology
technology
abc institute
abc institute engineering
institute engineering technology
engineering
institute engineering
现在我在搜索术语“abc institute technology”
IndexSearcher searcher = new IndexSearcher(dir);
BooleanQuery booleanQuery = new BooleanQuery();
PhraseQuery query = new PhraseQuery();
query.add(new Term("insti_shingles", "abc institute technology"));
query.setSlop(4);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
TopDocs hits = searcher.search(booleanQuery, 30);
现在根据slop短语查询的文档,我应该得到一些结果,但我得到空结果集。但是当我搜索与索引标记完全一样的术语时,我得到了结果。
我认为当我们使用短语查询时,术语“abc institute technology”应该与令牌“abc institute engineering”相匹配???
我做错了吗?帮助
答案 0 :(得分:0)
你不需要特殊的标记化器来使用slop的短语查询 - 事实上,正如你所注意到的那样,它会导致这些查询失败。
使用StandardAnalyzer
进行标记,无需执行自定义的shingle内容。