我想查询符合以下任何值的所有文档:
["Test","Cat","Dog"]
在字段类别中。
我有以下映射:
"categories": {
"type": "string"
}
有几个示例文档
"categories": [
"Test",
"Cat"
]
或者
"categories": [
"Blue Cat",
"Ball"
]
我能够通过以下查询将其拉出来:
query: {
match: {
categories: {
query: ["Test","Cat","Dog"]
}
}
但这会让我回复两份文件,因为它们都包含了#34; Cat"即使其中一个以“蓝猫”#34;的形式包含它,我怎么能指定他们我想要的确切价值" Cat"不是它包括它吗?
我读过有关将映射的字段类型更改为嵌套的内容,但是不接受数组作为嵌套对象,因为它没有键和值。
如果我使用此映射:
"categories": {
"type": "nested"
}
我收到此错误:
"object mapping for [categories] tried to parse field [null] as object, but found a concrete value"
如何使用可能值的数组按字段类别进行过滤,并确保它至少与其中一个值匹配?
答案 0 :(得分:6)
将字段更改为“not_analyzed”。现在它使用默认的“标准”分析器,将“Blue Cat”分成两个标记“Blue”和“Cat”,这就是为什么你的查询与包含“Blue Cat”的文档相匹配的原因。
这是映射
{
"categories": {
"type": "string",
"index": "not_analyzed"
}}
我使用上面的映射索引了两个文档。
{
_index : "test_index",
_type : "test",
_id : "2",
_score : 1,
_source : {
categories : [
"Blue Cat",
"Ball"
]
}}, {
_index : "test_index",
_type : "test",
_id : "1",
_score : 1,
_source : {
categories : [
"Test",
"Cat"]
}}]}
我使用以下模板搜索
{
"query" : {
"constant_score" : {
"filter" : {
"terms" : {
"categories" :["Test","Cat","Dog"]
}
}
}
}}
我只收到第一份文件
{
"took" : 9,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1,
"hits" : [{
"_index" : "test_index",
"_type" : "test",
"_id" : "1",
"_score" : 1,
"_source" : {
"categories" : [
"Test",
"Cat"
]
}
}
]
}}