簡體   English   中英

如何檢測Lucene索引中是否已存儲類似文檔

[英]How do I detect if there is already a similar document stored in Lucene index

我需要在數據庫中排除重復項。 問題是重復不被認為是完全匹配,而是類似的文檔。 為此我決定使用如下的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));

我跟着來自下面的recomendations,結果是: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 它與Lucent.NET有一些已知的兼容性問題 ,但無論如何都要好得多。

我是對盧克的推薦。 其他一些嘗試:

  1. 首先嘗試一個確切的查詢,對術語“文本”說一個TermQuery。 如果這不起作用,則不會進行模糊查詢。
  2. 使用Explain()查看評分是如何進行的(如果得到其他評分)。
  3. 按照調試搜索中的相關性問題的建議。

嘗試在Lucene中使用MoreLikeThis類...它有一些很好的啟發式編碼,可以幫助您識別“類似”文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM