Get matched terms from Lucene query

前端 未结 5 1060
南笙
南笙 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:38

    Although the sample is in c#, Lucene APIs are very similar(some upper/lower case differences). I don't think it would be hard to translate to java.

    This is the usage

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

    And here is the method

    void GetHitTerms(Query query,IndexSearcher searcher,int docId,List hitTerms,Listrest)
    {
        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);
        }
    }
    

提交回复
热议问题