У меня разные индексы в поиске 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
. Не уверен, что это может сработать.