【问题标题】:Lucene number of occurrencesLucene 出现次数
【发布时间】:2012-06-19 06:46:42
【问题描述】:

我在我的 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);
        }

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

谢谢!

【问题讨论】:

  • 没有内置的方法可以做到这一点,因为通常这些信息几乎没有意义。您可以使用 TermFreqVector 但它会很慢。您仍然需要分数和/或想要按分数排序吗?
  • 它有挖矿。这对我很重要。我必须根据我的请求结果对组织进行评级。请求由组织名称组成。实际上,我打算在我的搜索结果上建立新的索引,然后在它上面使用 Term request 来计算 termFreq,这不是个好主意吗?
  • 我能否让 score 变得不那么复杂,而只是出现一些情况?

标签: asp.net lucene lucene.net


【解决方案1】:

如果您不想返回分数并且不想使用分数对结果进行排序,您可以构建一个自定义的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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多