Возврат различных значений в Elasticsearch

Я пытаюсь решить проблему, когда мне нужно получить отчетливый результат поиска.

{
        "name" : "ABC",
        "favorite_cars" : [ "ferrari","toyota" ]
      }, {
        "name" : "ABC",
        "favorite_cars" : [ "ferrari","toyota" ]
      }, {
        "name" : "GEORGE",
        "favorite_cars" : [ "honda","Hyundae" ]
      }

Когда я выполняю поисковый запрос о любимых автомобилях «ferrari». Я получаю два результата с именем ABC. Я просто хочу, чтобы в этом случае возвращаемый результат был единицей. Поэтому мое требование будет заключаться в том, могу ли я применить отдельное поле имени для получения одного результата 1.

Спасибо


person Ashit_Kumar    schedule 26.12.2016    source источник
comment
Насколько я знаю, вы не можете этого сделать. Максимум, что вы можете сделать, это подсчитать их с помощью агрегации терминов. В моем случае я удаляю их после использования набора Java. Если вы найдете способ, дайте мне знать.   -  person Yeikel    schedule 27.12.2016
comment
@Yeikel решение, предоставленное Вэлом, работает для меня. Это полезно для вас.   -  person Ashit_Kumar    schedule 27.12.2016


Ответы (1)


Один из способов добиться желаемого — использовать агрегацию terms в поле name, а затем top_hits субагрегация с размером 1, например:

{
  "size": 0,
  "query": {
    "term": {
      "favorite_cars": "ferrari"
    }
  },
  "aggs": {
    "names": {
      "terms": {
        "field": "name"
      },
      "aggs": {
        "single_result": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  }
}

Таким образом, вы получите один термин ABC, а затем вложите в него один соответствующий документ.

person Val    schedule 27.12.2016
comment
Спасибо @Val, это действительно помогло. - person Ashit_Kumar; 27.12.2016
comment
Круто, рад, что помогло! - person Val; 27.12.2016
comment
@Val Вы знаете, насколько дороги эти агрегаты? - person Yeikel; 28.12.2016
comment
Этот совсем не дорогой. - person Val; 28.12.2016