Агрегация терминов по двум полям в Elasticsearch

Я не уверен, что то, что я хочу сделать, возможно. У меня есть данные, которые выглядят так:

{
    "Actor1Name": "PERSON",
    "Actor2Name": "OTHERPERSON"
}

Я использую copy_to, чтобы заполнить вторичное поле ActorNames обоими значениями.

Я пытаюсь создать возможность ввода текста, когда пользователь может начать вводить имя, и оно будет заполнено лучшими совпадениями для этого префикса. Я хочу, чтобы он выполнял поиск по обоим полям актера. Единственная проблема заключается в том, что при поиске по именам актеров я получаю оба значения, даже если совпадает только одно из них. Это означает, что если я ищу префикс O, я получу как ДРУГОЙ ЛИЦ (желаемый), так и ЧЕЛОВЕК (нежелательный) в своих результатах на основе вышеуказанного документа.

Мое текущее решение состоит в том, чтобы запустить 2 агрегата и объединить их на стороне клиента, но возможно ли сделать это исключительно в ES?

Текущий запрос:

{
  "query": {
    "prefix": {
      "ActorNames": "O"
    }
  },
  "aggs": {
    "actor1": {
      "filter": {
        "prefix": {
          "Actor1Name": "O"
        }
      },
      "aggs": {
        "actor1": {
          "terms": {
            "field": "Actor1Name",
          }
        }
      }
    },
    "actor2": {
      "filter": {
        "prefix": {
          "Actor2Name": "O"
        }
      },
      "aggs": {
        "actor2": {
          "terms": {
            "field": "Actor2Name",
          }
        }
      }
    }
  }
}

person Derek    schedule 23.03.2019    source источник


Ответы (1)


Если вы хотите проверить состояние префикса в обоих полях, почему бы не использовать AND для префикса в обоих полях? Нравиться:

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "Actor1Name": "O"
          }
        },
        {
          "prefix": {
            "Actor2Name": "O"
          }
        }
      ]
    }
  }
}
person Yashasvi Raj Pant    schedule 23.03.2019
comment
Потому что я хочу сопоставить документы, в которых любой из актеров начинается с O, но я хочу включить в агрегацию только тех актеров, которые начинаются с O. - person Derek; 24.03.2019