假设我的索引中有一些文档如下所示:
{
"category":"2020",
"properties":[
{
"name":"foo",
"value":"2"
},
{
"name":"boo",
"value":"2"
}
]
},
{
"category":"2020",
"properties":[
{
"name":"foo",
"value":"8"
},
{
"name":"boo",
"value":"2"
}
]
}
我想以一种方式查询索引,只返回那些匹配"foo":"2"
但不匹配"boo":"2"
的文档。
我尝试编写一个与properties.name
和 properties.value
匹配的查询,但后来我得到了误报。我需要一种方法告诉ElasticSearch名称和值必须是相同属性元组的一部分。
我该怎么做?
答案 0 :(得分:3)
您需要将properties
映射为nested
type。所以你的映射看起来与此类似:
{
"your_type": {
"properties": {
"category": {
"type": "string"
},
"properties": {
"type": "nested",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
}
}
}
}
}
}
然后,您在同一元组中匹配同一元组而不是"foo=2"
的{{1}}文档的查询需要相应地使用nested
query,如下所示。
"boo=2"
答案 1 :(得分:1)
@Val的回答和它一样好。但是,我要补充一点,因为它可以区分一种类型的查询和其他可能会受益于nested
s"#34;特征
在Elasticsearch中,用于自动创建此类字段的"properties":[{"name":"foo","value":"2"},{"name":"boo","value":"2"}]
的默认类型为object
。 object
的缺点是它不会将一个子字段的值与另一个子字段的值相关联,这意味着foo
不一定与{{2
相关联。 1}}。 name
只是一个值数组,value
是另一个值的数组,两者之间没有关联。
如果需要上述协会工作,那么nested
是必须的。
但是,我遇到过需要这些功能的情况。如果您需要这两个,可以设置include_in_parent: true
for the mapping,以便您可以利用这两者。我见过的其中一个情况是here。
"properties": {
"type": "nested",
"include_in_parent": true,
"properties": {
"name": {
"type": "string"
...