12

我已将我的 Elastic Search 实现配置为通过映射中的 id 对结果进行分面,当我向用户显示该分面时,我需要能够显示代表它的人类可读名称。我需要的数据都存在于映射中,但我不确定如何将它作为方面的一部分返回。肯定有可能吗?

鉴于以下示例,我想给我一些方法来关联thingIdto thingName(或任何其他thing可能需要的属性):

映射

{
  thingId,
  thingName
}

分面查询

{
  "facets":{
    "things":{ "terms":{ "field":"thingId" } }
  }
}    

结果

{
  "hits":{
    "total":3,
    "max_score":1.0,
    "hits":[
      ...
    ]
  },
  "facets":{
    "things":{
      "_type":"terms",
      "missing":0,
      "total":3,
      "other":0,
      "terms":[
        {
          "term":"5",
          "count":1
        },
        {
          "term":"4",
          "count":1
        },
        {
          "term":"2",
          "count":1
        }
      ]
    }
  }
}

编辑

这个关于 Solr 的答案表明我对两个属性 (thingNamethingId) 进行构面,然后在两个构面结果集上进行循环,假设项目的顺序是相同的。我不知道这有多可靠,但这是一种选择。

编辑 2

这个答案表明,如果不将这两个字段组合成一个值并对此进行分面,就不可能做我想做的事情:thingId|thingName. 不理想。

编辑 3

这个答案建议将值组合到一个字段中并在其上进行刻面(如上所述),但它使用术语脚本来实现组合,因此不需要我索引值的组合形式。仍然不完美,但似乎是最不糟糕的选择。

4

1 回答 1

4

如果您不喜欢使用术语脚本,那么另一个选项是使用嵌套聚合,假设您能够使用 1.0.0。

然后,您的聚合将如下所示:

{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "theIds": {
            "terms" : {
                "field": "thingId"
            },
            "aggs":{
                "theNames": {
                    "terms": {
                        "field": "thingName"
                    }
                }
            }
        }
    }
}

响应将类似于:

"aggregations": {
      "theIds": {
         "buckets": [
            {
               "key": "1",
               "doc_count": 5,
               "theNames": {
                  "buckets": [
                     {
                        "key": "AAA",
                        "doc_count": 3
                     },
                     {
                        "key": "BBB",
                        "doc_count": 3
                     },
                     {
                        "key": "CCC",
                        "doc_count": 2
                     }
                  ]
               }
            },
            {
               "key": "2",
               "doc_count": 2,
               "theNames": {
                  "buckets": [
                     {
                        "key": "AAA",
                        "doc_count": 2
                     }
                  ]
               }
            }
         ]
      }
   }
于 2014-02-14T17:36:49.680 回答