Elasticsearch:获取数组包含多个值之一的所有文档
Elasticsearch: get all documents where array contains one of many values
我在 Elasticsearch 中有以下文档数据结构:
{
"topics": [ "a", "b", "c", "d" ]
}
我有一个选择列表,用户可以在其中过滤要显示的主题。当用户对他们的过滤器满意时,他们将看到所有包含他们在数组 "topics"
中选择的任何主题的文档
我试过查询
{
"query": {
"terms": {
"topics": ["a", "b"]
}
}
}
但是这个returns没有结果。
扩展查询。例如,列表 ["a", "b"]
将匹配下面数组中的第一个、第二个和第三个对象。
在 Elasticsearch 中有什么好的方法可以做到这一点吗?显然,我可以进行多个 "match" 查询,但这很冗长,因为我有数百个主题
编辑:我的映射
{
"fb-cambodia-post": {
"mappings": {
"scrapedpost": {
"properties": {
"topics": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
}
}
}
}
}
我将提供有关该问题的更多信息。使用您添加的数据("a"、"b"、"c")的查询将有效,但如果主题有大小写或多个单词,则不会。这是由于应用于主题字段的分析器。当您将字符串值添加到 ElasitcSearch 时,它将默认使用 standard analyzer. The terms query only compares raw terms as they are put. So if you have something like "Topic1" in the document and you search "terms":["Topic1"] it won't return any value because the term in standard analyzer is lowercased and the query that will return the value will be "terms":["topic1"]
. As of 5.0 elastic added the default "keyword" subfield that stores the data with the keyword analyzer。并且它按原样存储它,没有应用任何转换。该字段上的术语 "terms.keyword":["Topic1"]
将为您提供值,但 "terms.keyword":["topic1"]
不会。匹配查询的作用是在输入字符串上也应用过滤器,这样您就可以得到正确的结果。
正如@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"
}
}
}
我在 Elasticsearch 中有以下文档数据结构:
{
"topics": [ "a", "b", "c", "d" ]
}
我有一个选择列表,用户可以在其中过滤要显示的主题。当用户对他们的过滤器满意时,他们将看到所有包含他们在数组 "topics"
中选择的任何主题的文档我试过查询
{
"query": {
"terms": {
"topics": ["a", "b"]
}
}
}
但是这个returns没有结果。
扩展查询。例如,列表 ["a", "b"]
将匹配下面数组中的第一个、第二个和第三个对象。
在 Elasticsearch 中有什么好的方法可以做到这一点吗?显然,我可以进行多个 "match" 查询,但这很冗长,因为我有数百个主题
编辑:我的映射
{
"fb-cambodia-post": {
"mappings": {
"scrapedpost": {
"properties": {
"topics": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
}
}
}
}
}
我将提供有关该问题的更多信息。使用您添加的数据("a"、"b"、"c")的查询将有效,但如果主题有大小写或多个单词,则不会。这是由于应用于主题字段的分析器。当您将字符串值添加到 ElasitcSearch 时,它将默认使用 standard analyzer. The terms query only compares raw terms as they are put. So if you have something like "Topic1" in the document and you search "terms":["Topic1"] it won't return any value because the term in standard analyzer is lowercased and the query that will return the value will be "terms":["topic1"]
. As of 5.0 elastic added the default "keyword" subfield that stores the data with the keyword analyzer。并且它按原样存储它,没有应用任何转换。该字段上的术语 "terms.keyword":["Topic1"]
将为您提供值,但 "terms.keyword":["topic1"]
不会。匹配查询的作用是在输入字符串上也应用过滤器,这样您就可以得到正确的结果。
正如@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"
}
}
}