Агрегирование терминов по двум полям в Elasticsearch - PullRequest
0 голосов
/ 23 марта 2019

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

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

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

Я пытаюсь создать возможность typeahead, гдеПользователь может начать вводить имя, и оно будет заполнено самыми популярными для этого префикса.Я хочу, чтобы поиск по обоим полям актера.Единственная проблема заключается в том, что при поиске по ActorNames я получаю оба значения, даже если совпадает только одно.Это означает, что, если я ищу префикс O, я получу OTHERPERSON (желательно) и PERSON (нежелательно) в моих результатах, основанных на приведенном выше документе.

Мое текущее решение - запустить 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",
          }
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 24 марта 2019

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

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "Actor1Name": "O"
          }
        },
        {
          "prefix": {
            "Actor2Name": "O"
          }
        }
      ]
    }
  }
}
...