我有一項服務,可以推薦與用戶當前上下文相關的文檔(文件)。它將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個文檔實例的部分集成爲具有相同字段「唯一性」的值。
有沒有人有一個想法如何解決這個問題?
是的。這是一個可能的解決方案,儘管我希望找到一些解決方案,可以在其中搜索彈性搜索以獲取不同的文件。如果你的建議被應用了,那麼找到文件重複的最好方法是什麼?使用更喜歡這個,並選擇分數接近1.0的結果? –
這將是一個選項。但是如果你的內容完全一樣,我會建議使用散列(例如MD5)來查找重複。 – fatih
這是我的第一個想法,但我擔心它不會給我想要的結果,例如,如果兩個用戶上傳由不同的pdf打印機生成的同一pdf書籍,所以例如在其中一本書中丟失了一個字母。這些文件的MD5將不會相同,因此我將再次推薦同一本書的兩個實例。 –