Запрос одного и того же поля в разных вложенных путях в разных индексах в Elasti c Поиск - PullRequest
0 голосов
/ 05 апреля 2020

У меня разные индексы в поиске elasti c, где объект root в одном индексе может быть вложен в другой индекс. Например, допустим, у нас есть индекс employee и индекс deplartment.

Первый индекс содержит документы с информацией о сотрудниках, скажем employee_id, name et c. Индекс отдела в root содержит информацию об отделе, такую ​​как department_id, name и массив Nested типа employees, каждый из которых является объектом сотрудника, как показано ниже:

GET /employee/_doc/1

{
  ...
  ...
  _source: {
    "_id": 1,
    "employee_id": "240349",
    "name": "John Doe",
    ...


  }
}

И что-то об отделе например:

GET /department/_doc/1

{
  ...
  ...
  _source: {
    "_id": 1,
    "department_id": "D2",
    "name": "Marketing",
    "employees": [{
      "_id": 1,
      "employee_id": "240349",
      "name": "John Doe",
      ...
    }]
  }
}

Эта информация должна запрашиваться на панели поиска, где пользователь может просто ввести что-то в текстовое поле поиска, и он должен возвращать результаты по полям, охватывающим все индексы. Кроме того, пользователь может использовать синтаксис запроса Lucene для поиска по указанным c полям, таким как employee_id: 240349. В таком случае должны быть возвращены как employee, так и department с указанным сотрудником.

Проблема здесь заключается в том, что в индексе отдела поле employee_id находится внутри массива employees. Поэтому необходимо указать путь к полю employees.employee_id. Но я не хочу показывать это пользователю, пользователь должен иметь возможность сопоставить это с employee_id для обоих индексов.

Одним из способов достижения этого может быть использование библиотеки Lucene и использование ее ' QueryParser, чтобы получить поля и поддерживать сопоставление имен полей API с именами полейasticsearch для каждого индекса и преобразовать запрос в ES. Но это кажется очень грязным.

Есть ли лучший способ достичь этого. Есть ли способ сказать elasti c search, что когда я запрашиваю employee_id в department index, я на самом деле имею в виду employees.employee_id?

Возможные пути к решениям:

1 - Поддерживать сопоставление имен полей в пользовательском интерфейсе с путями полей в индексах, использовать анализатор запросов для разбора queryString и заменять пути полей сопоставленных индексов.

2 - использовать псевдоним поля employee_id в качестве массива для ссылки на имя поля в индексе отдела. Не удалось создать псевдоним для вложенного типа. Требуется та же область.

3 - Используйте какие-то подстановочные запросы, например *employee_id:123. Не уверен, что это может сработать.

...