【发布时间】:2019-05-26 20:01:47
【问题描述】:
我目前想用 MultiFieldQuery 实现 SpanQuery 以实现模糊措辞,但我遇到了问题。
我尝试过将 MultiFieldQuery 与 BooleanQuery 一起使用。它只是部分起作用,它可以搜索模糊短语但短语不跟随任何草率,例如,我的索引包含这个“检查这些”。当我搜索“签出”时,它会返回一个命中并显示这个“签出这些”。这就是我想要的结果。但是,当我搜索“检查这些”时,它也会返回一个命中并显示这个“检查这些”。在这种情况下,它应该会失败,因为“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 检查这些内容时,它会返回未命中。这是我想要的部分内容,但它仅适用于一个字段。我正在尝试将其应用于许多字段
【问题讨论】:
-
您想在多个字段中搜索带有 slop 的相同术语吗?听起来像一个由几个 SpanNearQuery 组成的 BooleanQuery 就是你需要的
-
另外,您使用的是哪个 lucene 版本?
标签: java lucene fuzzy-search