由数组中的对象(标签)构成

时间:2015-09-25 20:56:59

标签: elasticsearch

我遇到了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。

有人可以帮我解决这个问题吗?如何获取阵列中对象的分面列表?

任何帮助都将不胜感激。

谢谢,

1 个答案:

答案 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,您可以再次选择aggregationstagName的那些标记,然后检索关联的T1字段。这样可以获得预期的tagValueV1值。

X1