c# - 如何检测 Lucene 索引中是否已经存储了类似的文档

标签 c# lucene lucene.net morelikethis

我需要排除数据库中的重复项。问题是重复项不被视为完全匹配,而是相似的文档。为此,我决定使用 FuzzyQuery,如下所示:

var fuzzyQuery = new global::Lucene.Net.Search.FuzzyQuery(
                     new Term("text", queryText),
                     0.8f,
                     0);
 hits = _searcher.Search(query);

我们的想法是将最小相似度设置为 0.8(我认为这已经足够高了),这样只会找到相似的文档,排除那些不够相似的文档。

为了测试这段代码,我决定看看它是否找到了已经存在的文档。为变量 queryText 分配了一个存储在索引中的值。上面的代码什么也没找到,换句话说,它甚至没有检测到完全匹配。

索引是由这段代码建立的:

 doc.Add(new global::Lucene.Net.Documents.Field(
            "text",
            text,
            global::Lucene.Net.Documents.Field.Store.YES,
            global::Lucene.Net.Documents.Field.Index.TOKENIZED,
            global::Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));

我遵循了下面的建议,结果是: TermQuery 不返回任何结果。 构造查询

 var _analyzer = new RussianAnalyzer();
 var parser = new global::Lucene.Net.QueryParsers
                .QueryParser("text", _analyzer);
 var query = parser.Parse(queryText);
 var _searcher = new IndexSearcher
       (Settings.General.Default.LuceneIndexDirectoryPath);
 var hits = _searcher.Search(query);

返回分数最高的几个结果,其中完全匹配的文档和其他几个内容相似的文档。

最佳答案

查看索引内部可能会有所帮助 - 将清楚地显示您正在查询的数据以及 Lucene 如何“查看”您的数据。您可以使用 Luke为了这。它有一些已知的compatibility issues使用 Lucent.NET,但总比没有好得多。

关于c# - 如何检测 Lucene 索引中是否已经存储了类似的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2230909/

相关文章:

C# 授予对特定不相关类的访问权限

Lucene.NET 生命周期管理

asp.net - 项目保存时出错 - 未找到字段 : 'Store.COMPRESS'

c# - RavenDB Map Reduce 非重复索引

c# - Ormlite 不会将日期时间从 SQL Server 映射到 C#?

c# - 如何在 XAML 模板中使用 WPF 自定义控件属性?

c# - .Net 6使用选项模式读取以int为键的json文件

lucene - solr 搜索不存在字段的文档

Lucene 对短语进行模糊搜索(FuzzyQuery + SpanQuery)

java - 搜索结果归因于 Hibernate Search 中的字段