lucene - 从 Lucene 查询中获取匹配的术语

标签 lucene

给定一个像这样的 Lucene 搜索查询:+(letter:A letter:B letter:C) +(style:Capital),我如何判断这三个字母中的哪一个实际上与任何给定文档匹配?我不关心他们在哪里匹配,或者他们匹配了多少次,我只需要知道他们是否匹配。

目的是对初始查询(“A B C”),去除成功匹配的词(A和B),然后对余数(C)做进一步处理。

最佳答案

虽然示例是在 c# 中,但 Lucene API 非常相似(一些大小写差异)。我认为翻译成 Java 并不难。

这是用法

List<Term> terms = new List<Term>();    //will be filled with non-matched terms
List<Term> hitTerms = new List<Term>(); //will be filled with matched terms
GetHitTerms(query, searcher,docId, hitTerms,terms);

这是方法

void GetHitTerms(Query query,IndexSearcher searcher,int docId,List<Term> hitTerms,List<Term>rest)
{
    if (query is TermQuery)
    {
        if (searcher.Explain(query, docId).IsMatch() == true) 
            hitTerms.Add((query as TermQuery).GetTerm());
        else
            rest.Add((query as TermQuery).GetTerm());
        return;
    }

    if (query is BooleanQuery)
    {
        BooleanClause[] clauses = (query as BooleanQuery).GetClauses();
        if (clauses == null) return;

        foreach (BooleanClause bc in clauses)
        {
            GetHitTerms(bc.GetQuery(), searcher, docId,hitTerms,rest);
        }
        return;
    }

    if (query is MultiTermQuery)
    {
        if (!(query is FuzzyQuery)) //FuzzQuery doesn't support SetRewriteMethod
            (query as MultiTermQuery).SetRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);

        GetHitTerms(query.Rewrite(searcher.GetIndexReader()), searcher, docId,hitTerms,rest);
    }
}

关于lucene - 从 Lucene 查询中获取匹配的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896183/

相关文章:

solr - 如何在 Solr 中进行常量分数查询

performance - 如何在分布式环境中提高 Lucene 性能?

zend-framework - 用于lucene文本搜索的无效字符

lucene - ElasticSearch 中的排序和最新记录

java - Eclipse 插件中的 Lucene NoSuchMethodError

lucene - 你如何从lucene文档中读取整数值?

c# - 执行 Lucene 搜索查询 "Contains"

lucene - 如何使用 Lucene 查询从露天共享 UI 获取特定内容类型文档计数

lucene - solr不区分大小写的排序不起作用

java - 执行 Lucene 通配符搜索