我目前想用SpanQuery和MultiFieldQuery来实现模糊短语,但是我遇到了问题。
我尝试将MultiFieldQuery与BooleanQuery结合使用。它仅部分起作用,它可以搜索模糊短语,但该短语不会跟随任何斜率,例如,我的索引包含此“ Check out these”。当我搜索“签出”时,它将返回一个匹配并显示此“签出这些”。这是我想要的结果。但是,当我搜索“检查这些”时,它也会返回匹配并显示此“检查这些”。在这种情况下,它应该失败,因为“ out”是第二个单词。
我也尝试过使用SpanQuery。如果使用此方法,则不会发生上述情况。但是,我只能搜索一个字段。而我想搜索多个字段。
private static TopDocs searchInFuzzyPhrase(String textToFind, String textToFind1, IndexSearcher searcher, int slop)
throws Exception {
// Create search query in phrase
Analyzer analyzer = new StandardAnalyzer();
//multifield
MultiFieldQueryParser query = new MultiFieldQueryParser(new String[]
{ "FULL_NAME", "BRAND_NAME", "DISPLAY_NAME", "DISPLAY_NAME_SYNONYM" }, analyzer);
query.setPhraseSlop(slop);
BooleanQuery bQuery = new BooleanQuery.Builder()
.add(query.parse(textToFind + "~"), BooleanClause.Occur.MUST)
.add(query.parse(textToFind1 + "~"), BooleanClause.Occur.MUST)
.build();
//span
SpanQuery[] clauses = new SpanQuery[2];
clauses[0] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("DISPLAY_NAME", textToFind)));
clauses[1] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("DISPLAY_NAME", textToFind1)));
SpanNearQuery sQuery = new SpanNearQuery(clauses, slop, true);
TopDocs hits = searcher.search(bQuery, 1);
return hits;
}
使用前面的示例。 “看看这些” 当我使用MultiField + BooleanQuery搜索“检查这些”时,它将返回一个命中,但是,这不是我想要的。
当我搜索“使用SpanQuery进行检查时,它将返回未命中。这是我想要的一部分,但仅适用于一个字段。我正尝试将其应用于多个字段
答案 0 :(得分:0)
这里的问题是,跨度仅在一个字段上起作用。这是可以理解的,因为不同字段之间几乎没有位置的概念。
您将需要使用相同的代码,只需将其扩展到您拥有的所有字段列表即可。
例如对于列表"FULL_NAME", "BRAND_NAME", "DISPLAY_NAME", "DISPLAY_NAME_SYNONYM"
中的每个字符串,都需要像示例中那样创建SpanQuery
,然后将它们全部与BooleanQuery
组合成一个Occur.SHOULD