0

我在我的 Web 应用程序中使用 Lucene.net。一切正常,但现在我必须在 hits 数组的每个文档中显示我的“搜索字符串”的出现次数。我怎样才能做到这一点?我使用通常的 BooleanQuery。

那是我的搜索:

BooleanQuery bq = new BooleanQuery();
bq.Add(QueryParser.Parse(Lquery, "", CurIndexDescritor.GetLangAnalizer()), false,false);
            BooleanQuery.SetMaxClauseCount(int.MaxValue);

IndexSearcher searcher = new IndexSearcher(indexPath);
            Hits hits = (filter != null) ? searcher.Search(bq, filter) :         searcher.Search(bq);

 for (int i = 0; i < hits.Length(); i++)
        {
            Document doc = hits.Doc(i);
            SearchResultItem MyDb = new SearchResultItem();
            MyDb.key = doc.Get(KeyField);
            MyDb.score = hits.Score(i);
            result.Add(MyDb);
        }

我在哪里可以获得出现次数?

谢谢!

4

1 回答 1

2

如果您不想返回分数并且不想使用分数对结果进行排序,您可能会构建一个自定义Similarity实现。

快速测试了以下代码,它似乎与 TermQueries 和 PhraseQueries 一起工作得很好,但我没有测试更多的查询类型。一次PhraseQuery命中计为一次出现。

public class OccurenceSimilarity : DefaultSimilarity
{
    public override float Tf(float freq)
    {
        return freq;
    }
    public override float Idf(int docFreq, int numDocs)
    {
        return 1;
    }
    public override float Coord(int overlap, int maxOverlap)
    {
        return 1;
    }
    public override float QueryNorm(float sumOfSquaredWeights)
    {
        return 1;
    }
    public override Explanation.IDFExplanation idfExplain(System.Collections.ICollection terms, Searcher searcher)
    {
        return CACHED_IDF_EXPLAIN;
    }
    public override Explanation.IDFExplanation IdfExplain(Term term, Searcher searcher)
    {
        return CACHED_IDF_EXPLAIN;
    }
    public override float SloppyFreq(int distance)
    {
        return 1;
    }
    private static Explanation.IDFExplanation CACHED_IDF_EXPLAIN = new ExplainIt();
    private class ExplainIt : Explanation.IDFExplanation
    {

        public override string Explain()
        {
            return "1";
        }

        public override float GetIdf()
        {
            return 1.0f;
        }
    }
}

要使用它:

Similarity.SetDefault(new OccurenceSimilarity());
于 2012-06-22T00:30:58.813 回答