【问题标题】:How to implment SpanQuery with MultiFieldQuery in java using lucene如何使用 lucene 在 java 中使用多字段查询实现 SpanQuery
【发布时间】: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


【解决方案1】:

这里的问题是,跨度只适用于一个领域。这是可以理解的,因为不同领域之间几乎没有位置的概念。

您需要遵循您拥有的相同代码,只需将其扩展到您拥有的所有字段列表。

例如对于列表中的每个字符串"FULL_NAME", "BRAND_NAME", "DISPLAY_NAME", "DISPLAY_NAME_SYNONYM",您需要像在示例中那样创建SpanQuery,然后将它们全部合并为一个BooleanQueryOccur.SHOULD

【讨论】: