1

我试图弄清楚如何为lucene.net在 c# 中多次出现相同单词的描述添加更多权重。

示例:
前置条件:

假设我有一个这样的项目列表:

  1. 恢复交换
  2. 备份交换
  3. exchange是一个非常棒的工具,exchange可以有很多邮箱

设想:

我搜索exchange.

该列表将按以下顺序返回:

  1. (它的权重与2相同,并首先添加到索引中)
  2. (它与1具有相同的权重,并且它被添加到第二个索引中)
  3. (里面有交换的参考,但长度大于1和2)

所以我试图#3首先出现,因为它在描述中交换了不止一次。

这是一些显示我设置相似度的代码:

// set up lucene searcher
            using (var searcher = new IndexSearcher(directory, false))
            {
                var hits_limit = 1000;
                var analyzer = new StandardAnalyzer(Version.LUCENE_29);

                searcher.Similarity = new test();

                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser = new QueryParser(Version.LUCENE_29, searchField, analyzer);
                    var query = parseQuery(searchQuery, parser);

                    var hits = searcher.Search(query, hits_limit).ScoreDocs;
                    var results = mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return results;
                }
                // search by multiple fields (ordered by RELEVANCE)
                else
                {
                    var parser = new MultiFieldQueryParser
                        (Version.LUCENE_29, new[] { "Id", "Name", "Description" }, analyzer);

                    var query = parseQuery(searchQuery, parser);
                    var hits = searcher.Search
                    (query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
                    var results = mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return results;
                }
4

1 回答 1

2

免责声明:我只能谈论 Lucene(而不是 Lucene.NET),但我相信它们是使用相同的原则构建的。

文档 #1 和 #2 首先出现的原因是字段权重(#1 为 1/2,#2 为 1/2)高于 #3 的 2/11(假设您没有使用停用词)。这里的要点是,前两个文档中的“交换”一词的权重远大于第三个文档中的权重。这就是默认相似度算法的工作原理。实际上,这有点复杂,您可以在给定的链接中观察到。

所以你要求的是另一种相似性算法。这里有一个类似的讨论MySim,我相信,试图实现接近你想要的东西。只是不要忘记将这个相似性实例设置为索引编写器和搜索器。

于 2013-01-12T21:42:55.403 回答