Подтвердить что ты не робот

Дополнительные данные факела ElasticSearch

Я настроил реализацию Elastic Search для передачи результатов по идентификатору в сопоставлении, и когда я показываю этот фасет пользователю, мне нужно показать отображаемое человеком имя, которое его представляет. Данные, которые мне нужны, все присутствуют в сопоставлении, но я не уверен, как я могу вернуть его как часть грани. Неужели это возможно?

В следующем примере я хотел бы, чтобы фасет дал мне способ сопоставить thingId to thingName (или любое другое свойство thing, которое может потребоваться):

Mapping

{
  thingId,
  thingName
}

Запрос Facet

{
  "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
        }
      ]
    }
  }
}

Edit

Этот ответ, касающийся Solr, говорит о том, что я охарактеризую оба свойства (thingName и thingId), а затем просто перебираю оба набора результатов фасет, считая, что порядок предметов будет одинаковой. Я не знаю, насколько это надежно, но это вариант.

Изменить 2

Этот ответ предполагает, что невозможно выполнить то, что я хочу, не объединяя два поля в одно значение и огранку на этом: thingId|thingName. Не идеально.

Изменить 3

Этот ответ предлагает объединить значения вместе в одно поле и огранку на нем (как указано выше), но для достижения комбинации использует термины script поэтому мне не нужно индексировать комбинированную форму значений. Все еще не идеальный, но, по-видимому, самый дрянной вариант.

4b9b3361

Ответ 1

Если вы не довольны использованием терминов scripting, то другими вариантами будет использование вложенных агрегатов, предполагая, что вы можете использовать 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
                     }
                  ]
               }
            }
         ]
      }
   }