如何检测Lucene索引中是否已存储类似文档

时间:2010-02-09 17:02:59

标签: 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);

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

3 个答案:

答案 0 :(得分:2)

查看索引内容可能有所帮助 - 将清楚地显示您要查询的数据以及Lucene如何“看到”您的数据。您可以使用Luke。它有一些已知的compatibility issues与Lucent.NET,但总比没有好。

答案 1 :(得分:1)

我是对卢克的推荐。还有一些其他的尝试:

  1. 首先尝试一个确切的查询,对术语“文本”说一个TermQuery。如果这不起作用,则不会有模糊查询。
  2. 使用Explain()查看评分是如何进行的(只要您获得其他点击量)。
  3. 按照Debugging Relevance Issues in Search的建议。

答案 2 :(得分:1)

尝试Lucene中的MoreLikeThis课程...它有一些很好的启发式编码,可以帮助您识别“类似”的文档。