简体   繁体   English

Lucene 中的 ES 匹配查询模拟

[英]ES Match query analogue in Lucene

I use queries like this one to run in ES:我使用这样的查询在 ES 中运行:

boolQuery.must(QueryBuilders.matchQuery("field", value).minimumShouldMatch("50%"))

What's the straight analogue for this query in Lucene? Lucene 中此查询的直接模拟是什么?

Match Query, as I understand it, basically analyzes the query, and creates a BooleanQuery out of all the terms the analyzer finds.据我了解,Match Query 基本上会分析查询,并根据分析器找到的所有术语创建一个 BooleanQuery。 You could get sorta close by just passing the text through QueryParser .你可以得到几分附近正好路过文通过QueryParser

But you could replicate it something like this:但是你可以像这样复制它:

public static Query makeMatchQuery (String fieldname, String value) throws IOException { 
    //get a builder to start adding clauses to.
    BooleanQuery.Builder qbuilder = new BooleanQuery.Builder();

    //We need to analyze that value, and get a tokenstream to read terms from
    Analyzer analyzer = new StandardAnalyzer();
    TokenStream stream = analyzer.tokenStream(fieldname, new StringReader(value));
    stream.reset();

    //Iterate the token stream, and add them all to our query
    int countTerms = 0;
    while(stream.incrementToken()) {
        countTerms++;
        Query termQuery = new TermQuery(new Term(
                fieldname, 
                stream.getAttribute(CharTermAttribute.class).toString()));
        qbuilder.add(termQuery, BooleanClause.Occur.SHOULD);
    }
    stream.close();
    analyzer.close();

    //The min should match is a count of clauses, not a percentage. So for 50%, count/2
    qbuilder.setMinimumNumberShouldMatch(countTerms / 2);
    Query finalQuery = qbuilder.build();
    return finalQuery;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM