2016-08-03 77 views
0

我有一個包含多個字段的〜50K文檔的索引。其中一個領域是「內容」,其中包含一個文本(可以只是幾個字或非常大的文章)。 在整個文檔中,關於「內容」字段有很多重複項。 我想添加一個group_id字段,它將指示它屬於哪個「content」重複文檔組。在elasticsearch中查找確切完整的文本匹配

我嘗試使用「匹配」和「more_like_this」,但他們似乎沒有返回確切的重複項,而是一個接近重複的重複項。

舉例: 考慮以下指標:

{ "author": "name1", "content": "text1" }, { "author": "name2", "content": "text2" } { "author": "name3", "content": "text1" } { "author": "name4", "content": "text2" } { "author": "name5", "content": "text3" }

我想獲得:

{ "author": "name1", "content": "text1", "group_id: 0 }, { "author": "name2", "content": "text2", "group_id: 1 } { "author": "name3", "content": "text1", "group_id: 0 } { "author": "name4", "content": "text2", "group_id: 1 } { "author": "name5", "content": "text3", "group_id: 2 }

謝謝!

回答

0

我會猜測,您的案例中的內容是一個分析字段 - 這是默認值,您還需要它能夠執行全文搜索查詢。但這意味着它並沒有真正的索引,因此您的Elasticsearch無法爲該字段找到完全匹配的字符串。您只能使用以下類型映射找到未分析字段的準確字符串匹配:

{ 
    "content": { 
     "type":  "string", 
     "index": "not_analyzed" 
    } 
} 

但是!這對你來說實際上是一個非常糟糕的主意,原因有兩個:首先,你將無法再在該字段上進行全文搜索,所以在分析和不分析的情況下,你必須將它索引兩次。其次,因爲它可能有相當大的值,這對整個索引和搜索是無效的。

您的實際需求並不是使用Elasticsearch進行大型字符串匹配,而是通過內容值對文檔進行分組。一個更好的方法是爲文檔添加一個字段,該字段包含內容字段的摘要(散列),然後按該字段進行分組。摘要不需要字符串字段,但將其保留爲數字實際上是有意義的。研究一些針對唯一性和速度設計的哈希算法,如MurmurHash3,它可以產生32位或128位散列。然後遍歷所有文檔並更新它們。

+0

似乎是一個好主意,我會嘗試。順便說一句,爲什麼保持摘要數字而不是字符串(比如md5)是有意義的? – Eitan

+0

任何摘要都從數字開始 - 它是一堆位(md5的情況下爲128位) - 將它編碼爲字符串表示形式以使其更具可讀性/可打印性。所以保持數值只是表示值的更緊湊的方式 - 更有效地存儲,索引和搜索。以Murmur3的32位變體爲例 - 數字存儲需要32位(即4個字節或一個長),編碼成最緊湊*可打印*表示的字符串爲base85(40位,5字節),隨後由base64(44位填充到48,因爲它是6個字節)。 –

+0

非常感謝您的回答和細節! (我的投票還沒有統計) – Eitan