2014-01-13 26 views
1

我有一項服務,可以推薦與用戶當前上下文相關的文檔(文件)。它將ElasticSearch more_like_this與過濾器結合使用(請參閱下面的查詢語句)。這些文件由用戶上傳,如果是公開的,則可以向其他用戶推薦。它工作正常,但是當兩個或更多用戶上傳相同的文件時會發生問題。 elasticsearch中有相同文檔的兩個或更多實例,並且很可能推薦兩個(或更多)文件。如何始終推薦Elasticsearch中的不同文檔(文件)

有沒有人有想法我可以如何強制ElasticSearch忽略這些重複項並只返回同一個文件的一個實例?

POST _search 
{ 
"query": { 
    "filtered": { 
    "query": { 
     "mlt": { 
     "fields": [ 
      "file" 
     ], 
     "like_text": "Some sample text here", 
     "min_term_freq": 1, 
     "max_query_terms": 1, 
     "min_doc_freq": 1 
    } 
    }, 
"filter" : { 
    "or" : { 
    "filters" : [ { 
     "term" : { 
     "visibility" : "public" 
     } 
    }, { 
     "and" : { 
     "filters" : [ { 
      "term" : { 
      "visibility" : "private" 
      } 
     }, { 
      "term" : { 
      "ownerId" : 2 
      } 
     } ] 
     } 
    } ] 
    } 
} 
} 
}, 
"fields": [ 
    "id","title","visibility", "ownerId","contentType", "dateCreated", "url"] 
} 

編輯:

我解決了這個問題的第一部分。我使用Tika從網頁或文本文檔中提取內容。然後,我將其用於更多像這樣的查詢,就像文本一樣查找最相似的文檔,而那些值高於0.9的文檔被標記爲重複。爲此,我使用具有UUID值的新字段「唯一性」。如果要編入索引的新文檔是重複的,那麼我將複製它的「唯一性」值,如果沒有重複項,我將爲該文檔創建新的「唯一性」值。

但是,我仍然沒有解決的問題的第二部分是如何進行查詢,以消除這些重複。所以基本上在上面提到的查詢中,我必須將只選擇1個文檔實例的部分集成爲具有相同字段「唯一性」的值。

有沒有人有一個想法如何解決這個問題?

回答

2

您可以定義一個「重複」字段,您可以在該字段中將值設置爲「true」或索引期間重複文檔的ID。那麼你可以過濾掉這些文件。

+0

是的。這是一個可能的解決方案,儘管我希望找到一些解決方案,可以在其中搜索彈性搜索以獲取不同的文件。如果你的建議被應用了,那麼找到文件重複的最好方法是什麼?使用更喜歡這個,並選擇分數接近1.0的結果? –

+1

這將是一個選項。但是如果你的內容完全一樣,我會建議使用散列(例如MD5)來查找重複。 – fatih

+0

這是我的第一個想法,但我擔心它不會給我想要的結果,例如,如果兩個用戶上傳由不同的pdf打印機生成的同一pdf書籍,所以例如在其中一本書中丟失了一個字母。這些文件的MD5將不會相同,因此我將再次推薦同一本書的兩個實例。 –

相關問題