我必須在Elasticsearch中構建相當不重要的(因爲它似乎是現在)查詢。 假設我有幾個實體,每個具有一個數組元素,由串:Elasticsearch中的數組元素匹配
1). ['A', 'B']
2). ['A', 'C']
3). ['A', 'E']
4). ['A']
映射爲數組元素如下(使用動態模板):
{
"my_array_of_strings": {
"path_match": "stringArray*",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}
的Json實體的表示看起來像這樣:
{
"stringArray": [
"A",
"B"
]
}
然後,我有用戶輸入: [ 'A', 'B', 'C']。
我想要實現的是找到僅包含輸入中指定元素的實體 - 預期結果爲: ['A','B'],['A','C'],['A' ]而不是['A','E'](因爲'E'不存在於用戶輸入中)。
這個場景可以用Elasticsearch實現嗎?
UPDATE: 除了使用腳本的解決方案 - 這應該很好地工作,但最有可能的情況下,大大減慢查詢時也有相匹配的多條記錄 - 我設計了一個又一個。下面我將嘗試解釋它的主要思想,沒有代碼實現。
我沒有提及的一個相當重要的條件是,數組由枚舉元素組成,即數組中有數量有限的元素。這允許將這樣的數組扁平化爲實體的單獨字段。假設有5種可能的值:'A','B','C','D','E'。這些值中的每一個都是布爾型字段 - 如果它是空的(即,數組版本將包含此元素)則爲true,否則爲false。
1).
A = true
B = true
C = false
D = false
E = false
2).
A = true
B = false
C = true
D = false
E = false
3).
A = true
B = false
C = false
D = false
E = true
4).
A = true
B = false
C = false
D = false
E = false
隨着[「A」,「B」,「C」]所有我需要做的用戶輸入是: 一個) 然後如下各實體可以改寫取所有可能的值(['A','B','C','D','E'])並從它們中減去用戶輸入 - >結果將是['D','E']; b)查找記錄,其中每個結果元素是假的,即'D =假AND E =假'。
這將給記錄1,2和4,如預期的那樣。我仍在試驗這種方法的代碼實現,但到目前爲止它看起來很有前途。它還有待測試,但我認爲這可能比在查詢中使用腳本更快,並且資源要求更低。
若要進一步優化這一點,可能不會提供完全爲'false'的字段,並將以前的查詢修改爲'D = not exists AND E = not exists' - result should be一樣。
您可以在映射過程中創建自定義分析器,然後分別搜索每個單詞(逗號前的字符)。 –
您能否提供文檔的映射?對細節提供反饋更容易(基於:是上面的字符串值'[A,E]'還是字符串數組['A','E']?)。我假設['A','E'],但在問題中指定它允許更清晰... – Calle
@Calle,謝謝你指出這一點。我會更新問題 –