TLDR;
Как сопоставить и отфильтровать локализованный поиск с локализованным индексом?
длинная версия
У меня есть приложение, в котором поиск пользователя должен выполняться в контексте его языка.
В индексе эластичного поиска мне нужны документы как со свойствами i18n, так и со свойствами, отличными от i18n (я хочу избежать создания нескольких индексов, по одному для каждого языка).
Отображение документа должно выглядеть так:
'entry': {
'properties': {
'name' : {'type': 'string'}, /* unlocalized properties */
'category': { /* localized properties */
"properties" : {
"lang_fr" : {
"type" : "string"
},
"lang_de" : {
"type" : "string"
}
}
},}}
имея это, у меня есть два требования:
1) Сопоставление: при выполнении поиска исключайте из поиска локализованные поля, которые не связаны с языком пользователя (скажем, язык пользователя «fr», я хочу исключить поля «de» из поиск. Как это сделать, не указывая весь список полей, по которым я хочу выполнить поиск. Для начала я попробовал это, но это не работает:
{
"query": {
"match": {
"*.lang_fr": "full_text"
}
}
}
Однако "categories.lang_fr": "full_text"
работает хорошо. Но я не хочу поддерживать список полей в запросе. Я хочу общее правило, как вы можете сделать в SolR.
2) Фильтрация: когда я получаю свои результаты, я хочу отфильтровать все локализованные поля, которые не соответствуют моему языку пользователя. Другими словами, используя исходный фильтр, я хотел бы иметь все нелокализованные поля, исключить все поля, начинающиеся с "lang", но включить все поля с "lang_fr". Я пробовал следующее, но это не работает:
{
"_source": {
"include": [ "*", "*.lang_fr" ],
"exclude": [ "*.lang_*" ],
}
...}
оператор подстановочного знака, похоже, не работает. У меня частично есть то, что я хочу, если я укажу "categories.lang_de"
, но опять же, я не хочу поддерживать список полей, я хочу общее правило. Операция включения/исключения работает не так, как хотелось бы. Единственное, что на самом деле работает, — это запрос, в котором я указываю все языки для исключения специально для всех полей, например:
{
"_source": {
"exclude": [ "categories.lang_de", "categories.lang_en", "categories.lang_it",
"another_field.lang_de", "catanother_fieldgories.lang_en", "another_field.lang_it"],
}
...}
для поиска 'fr'.
Я очень удивлен, что ничего не нашел в гугле. Я вижу это как очень стандартный случай применения i18n к elasticsearch. Может быть, я неправильно моделирую i18n в ES?
заранее спасибо !