Я создаю многоуровневый навигационный модуль с поддержкой elasticsearch для сайта ecomm. Все отлично работает, я могу получить параметры из внешнего источника и отобразить их. Их выбор тоже работает, но я столкнулся с проблемой, когда один из параметров фильтра имеет эти варианты;
FINISHES:
Finished (1)
Semi-Finished (16)
Semi Finished (1)
Ясно, что 2 варианта с дефисом и без него следует привести в порядок, но на мгновение игнорируя это, когда я применяю следующее к своей коллекции;
$client = $this->clientBuilder;
$params .... etc
$params['body']['query']['bool']['must'][] = ['match_phrase' => [$split[0] => "$selected"]];
$response = $client->search($params);
Где $split[0] — ссылка на поле elasticsearch для «ОТДЕЛКИ», а $selected — выбранное значение. Если вы нажмете на любой из вариантов, я верну все 18 записей. Несомненно, потому что все они содержат одно из искомых слов «завершено».
Как сделать этот поиск только по точному термину? Я пытался избежать дефиса с помощью \-, что не помогло, я также пытался проверить, есть ли в искомом термине пробелы или дефисы, и попытался принудительно добавить их в «must_not», но это тоже не сработало;
if(!$space) {
$params['body']['query']['bool']['must_not'][] = ['match' => [$split[0] => ' ']];
}
if(!$hyphen) {
$params['body']['query']['bool']['must_not'][] = ['match' => [$split[0] => '\\-']];
}
.keyword
? - person Polynomial Proton   schedule 01.05.2019.keyword
выполняет поиск по исходному тексту, т. е. не проанализированному. по умолчанию ко всем полям применяется стандартный анализатор. Таким образом, в вашем случаеSemi-Finished
является ключевым словом, а инвертированный индекс будет содержать два словаsemi
иfinished
, поэтому каждый раз, когда вы ищетеfinished
, он соответствует синусоидальному стандартному анализатору, разбивает его на дефис. Я не знаю php-код, который вы написали, однако синтаксисfieldname.keyword
, и я уверен, что его можно включить сюда. - person Polynomial Proton   schedule 01.05.2019