我遇到了ElasticSearch的查询问题。 我们的对象看起来像这样:
{
"id":"1234",
"tags":[
{ "tagName": "T1", "tagValue":"V1"},
{ "tagName": "T2", "tagValue":"V2"},
{ "tagName": "T3", "tagValue":"V3"}
]
}
{
"id":"5678",
"tags":[
{ "tagName": "T1", "tagValue":"X1"},
{ "tagName": "T2", "tagValue":"X2"}
]
}
我想获得tagName = T1的tagValues列表,它是“V1”和“X1”。 我试过了
{
"filter": {
"bool": {
"must": [
{
"term":{
"tags.tagName": "T1"
}
}
]
}
},
"facets": {
"TagValues":{
"filter": {
"term": {
"tags.tagName": "T1"
}
},
"terms": {
"field": "tags.tagValue",
"size": 30
}
}
}
}
好像它从所有标签“T1”,“T2”和“T3”返回所有tagValues。
有人可以帮我解决这个问题吗?如何获取阵列中对象的分面列表?
任何帮助都将不胜感激。
谢谢,
答案 0 :(得分:1)
主要想法是为您的tags
字段使用nested
type。以下是您应该使用的映射:
curl -XPUT localhost:9200/mytags -d '{
"mappings": {
"mytag": {
"properties": {
"id": {
"type": "string"
},
"tags": {
"type": "nested",
"properties": {
"tagName": {
"type": "string",
"index": "not_analyzed"
},
"tagValue": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}'
然后,您可以重新编制数据索引并运行如下所示的查询,该查询将首先仅过滤包含值为tagName
的{{1}}的文档,然后使用T1
(don&在弃用时不再使用facet,您可以再次选择aggregations
为tagName
的那些标记,然后检索关联的T1
字段。这样可以获得预期的tagValue
和V1
值。
X1