簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM