![](/img/trans.png)
[英]Query documents that contains all values in nested array Elasticsearch
[英]Elasticsearch: get all documents where array contains one of many values
我在Elasticsearch中具有以下文檔數據結構:
{
"topics": [ "a", "b", "c", "d" ]
}
我有一個選擇列表,用戶可以在其中過濾要顯示的主題。 當用戶對他們的過濾器表示滿意時,將向他們顯示所有具有在“主題”數組中選擇的任何主題的文檔
我試過查詢
{
"query": {
"terms": {
"topics": ["a", "b"]
}
}
}
但這不會返回任何結果。
擴展查詢。 例如,列表["a", "b"]
將與下面數組中的第一個,第二個和第三個對象匹配。
在Elasticsearch中有什么好方法嗎? 顯然,我可以進行多個“匹配”查詢,但這很冗長,因為我有數百個主題
編輯:我的映射
{
"fb-cambodia-post": {
"mappings": {
"scrapedpost": {
"properties": {
"topics": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
}
}
}
}
}
正如@Filip cordas所提到的,您可以使用topic.keyword
類的。
{
"query": {
"terms": {
"topics.not_analyzed": [
"A" , "B"
]
}
}
}
這將進行case sensitive
搜索。它將查找完全匹配。 如果您要case-insensitive
搜索,則可以使用query_string
例如:
{
"query": {
"query_string": {
"default_field": "topics",
"query": "A OR B"
}
}
}
我將提供有關該問題的更多信息。 帶有您添加的數據(“ a”,“ b”,“ c”)的查詢將起作用,但是如果主題帶有大寫字母或多個單詞,則將不起作用。 這是由於分析器已應用於主題字段。 將字符串值添加到ElasitcSearch時,默認情況下將使用標准分析器 。 字詞查詢僅對原始字詞進行比較。 因此,如果您在文檔中有類似“ Topic1”的內容,並且搜索“ terms”:[“ Topic1”],則它將不會返回任何值,因為標准分析器中的術語是小寫的,並且返回值的查詢將為"terms":["topic1"]
。 從5.0版本開始,elastic添加了默認的“關鍵字”子字段,該子字段使用關鍵字分析器存儲數據。 並按原樣存儲它,不應用任何轉換。 該字段中的術語"terms.keyword":["Topic1"]
會為您提供值,但"terms.keyword":["topic1"]
不會。 匹配查詢的劑量是多少,也將過濾器應用於輸入字符串,因此您將獲得正確的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.