Get matched terms from Lucene query

前端 未结 5 1095
南笙
南笙 2020-12-03 12:49

Given a Lucene search query like: +(letter:A letter:B letter:C) +(style:Capital), how can I tell which of the three letters actually matched any given document?

5条回答
  •  鱼传尺愫
    2020-12-03 13:31

    Here is a simplified and non-recursive version with Lucene.NET 4.8.
    Unverified, but this should also work on Lucene.NET 3.x

    IEnumerable GetHitTermsForDoc(Query query, IndexSearcher searcher, int docId)
    {
        //Rewrite query into simpler internal form, required for ExtractTerms
        var simplifiedQuery = query.Rewrite(searcher.IndexReader);
        HashSet queryTerms = new HashSet();
        simplifiedQuery.ExtractTerms(queryTerms);
    
        List hitTerms = new List();
        foreach (var term in queryTerms)
        {
            var termQuery = new TermQuery(term);
    
            var explanation = searcher.Explain(termQuery, docId);
            if (explanation.IsMatch)
            {
                hitTerms.Add(term);
            }
        }
        return hitTerms;
    }
    

提交回复
热议问题