3

我需要在我的数据库中排除重复项。问题是重复的文档不被视为完全匹配,而是相似的文档。为此,我决定使用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);

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

4

3 回答 3

2

查看索引内部可能会有所帮助 - 将清楚地显示您正在查询的数据以及 Lucene 如何“看到”您的数据。您可以为此使用卢克。它与 Lucent.NET 存在一些已知的兼容性问题,但总比没有好。

于 2010-02-09T20:26:40.367 回答
1

试试 Lucene 中的MoreLikeThis类……它有一些很棒的启发式编码,可以帮助您识别“相似”文档。

于 2010-04-02T02:01:41.370 回答
1

我赞同卢克的建议。其他一些可以尝试的事情:

  1. 首先尝试一个精确的查询,比如对术语“文本”说一个 TermQuery。如果这不起作用,则不会进行模糊查询。
  2. 使用Explain()查看得分情况(前提是您获得了其他命中)。
  3. 遵循Debugging Relevance Issues in Search 中的建议。
于 2010-02-10T08:21:24.697 回答