Elasticsearch:获取数组包含多个值之一的所有文档

H B*_*amy 0 dsl elasticsearch

我在 Elasticsearch 中有以下文档数据结构:

{
    "topics": [ "a", "b", "c", "d" ]
}
Run Code Online (Sandbox Code Playgroud)

我有一个选择列表,用户可以在其中过滤要显示的主题。当用户对他们的过滤器没问题时,他们将看到所有包含他们在数组“主题”中选择的任何主题的文档

我试过查询

{
    "query": {
        "terms": {
             "topics": ["a", "b"]
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不会返回任何结果。

扩展查询。例如,列表["a", "b"]将匹配下面数组中的第一个、第二个和第三个对象。

例子

在 Elasticsearch 中是否有一个很好的方法来做到这一点?显然我可以做多个“匹配”查询,但这很冗长,因为我有数百个主题

编辑:我的映射

{
    "fb-cambodia-post": {
        "mappings": {
            "scrapedpost": {
                "properties": {
                    "topics": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*cha 6

正如@Filip cordas 提到的,你可以使用topic.keywordlike。

 {
 "query": {
   "terms": {
     "topics.not_analyzed": [
        "A" , "B"
       ]
     }
   } 
 }
Run Code Online (Sandbox Code Playgroud)

这将进行case sensitive搜索。它将寻找完全匹配。如果你想case-insensitive搜索,你可以使用query_string

   {
    "query": {
     "query_string": {
       "default_field": "topics",
       "query": "A OR B"
     }
   }
}
Run Code Online (Sandbox Code Playgroud)