如何使用Lucene在Java中使用MultiFieldQuery实现SpanQuery

时间:2018-12-29 08:25:02

标签: java lucene fuzzy-search

我目前想用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进行检查时,它将返回未命中。这是我想要的一部分,但仅适用于一个字段。我正尝试将其应用于多个字段

1 个答案:

答案 0 :(得分:0)

这里的问题是,跨度仅在一个字段上起作用。这是可以理解的,因为不同字段之间几乎没有位置的概念。

您将需要使用相同的代码,只需将其扩展到您拥有的所有字段列表即可。

例如对于列表"FULL_NAME", "BRAND_NAME", "DISPLAY_NAME", "DISPLAY_NAME_SYNONYM"中的每个字符串,都需要像示例中那样创建SpanQuery,然后将它们全部与BooleanQuery组合成一个Occur.SHOULD