Как индексировать и применять в запросе отрицательные частицы в Elasticsearch?

Доброго дня!

Есть сайт, на котором работает поиск для пользователей, организованный с помощью Elasticsearch. Сам по себе он позволяет использовать расширенные поисковые конструкции - к примеру, фраза "помидоры -зеленые" найдет все помидоры, которые не являются зелеными. Проблема начинается с того момента, когда искать начинает обычный пользователь. Он, понятное дело, будет искать "помидоры не зеленые", что, вот сюрприз, найдет именно "зеленые помидоры".

Похожая проблема существет и на стадии индексации. Поскольку встретившуюся фразу "помидоры не зеленые" elastic будет индексировать как ["помидоры", "не", "зеленые"] (а слово "не" еще и в стопфильтрах встречается) и, соответственно, вполне успешно находить ее по фразе "зеленые помидоры".

Отсюда два вопроса про настройку Elasticsearch:
1) Можно ли сделать так, чтобы он при поиске воспринимал слово "не" как минус? То есть "не зеленые" = "-зеленые"?
2) И можно ли, чтобы он слово "не" на стадии индексации тоже умел как-то воспринимать, как отрицательную частицу?

К слову сказать сразу, я много гуглил эту тему. Думал про shingles, которые позволяют индексировать словосочетания, но они не решают проблему, поскольку:
1) обрабатывают только одну отдельно взятую отрицательную частицу, а их может быть несколько: "не", "без" и т.п.
2) поисковые фразы "не зеленый" и "-зеленый" все равно будут работать по-разному ("не зеленый" будет искать только те предложения, где явно встретилась фраза "не зеленый")
  • Вопрос задан
  • 547 просмотров
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Так может быть проще сделать замену на этапе приема строки поиска? Не все же на эластик вешать...
Тем более, этих частиц совсем немного, "не", "ни", "без", "и", "или"...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы