Для функции поиска в интернет-магазине я использую ongrasticsearchDSL (мерзавец / документы).
Основные настройки для поиска по названию продукта:
$boolQuery = new BoolQuery();
$boolQuery->addParameter('minimum_should_match', 1);
$wcQuery = new WildcardQuery('name', "*$_term*");
$boolQuery->add($wcQuery, BoolQuery::MUST);
Это имеет раздражающее поведение:
Запрос «Записная книжка» находит все товары с этим термином.
Но запрос «Записная книжка» вообще ничего не находит.
Возможно, подстановочный запрос в любом случае не лучшая практика.
Что мне нужно:
Какой лучший способ сделать это?
я пробовал MultiMatchQuery
с типами best_fields
а также phrase_prefix
а также SHOULD/MUST
комбинация, но либо результат имеет слишком много не относящихся к делу результатов, либо их вообще нет.
Спасибо за ваше время.
разобрался с решением:
$boolQuery = new BoolQuery();
$boolQuery->addParameter('minimum_should_match', '100%');
// search by manufacurer number
$wcQuery = new QueryStringQuery("$term", [
'fields' => [ 'manufacturerNumber' ]
]);
$boolQuery->add($wcQuery, BoolQuery::SHOULD);
// split query into single terms
$term = explode(" ", trim(preg_replace("@[^a-z0-9äöüß\-]@", " ", strtolower($term))));
// find all terms in any fields
foreach($term as $_term){
$wcQuery = new QueryStringQuery("*$_term*", [
'fields' => [ 'name', 'shortDescription', 'manufacturerName' ]
]);
$boolQuery->add($wcQuery, BoolQuery::SHOULD);
}
Думаю, ведущий символ подстановки не идеален, но он отлично работает. Никаких проблем с производительностью вообще.
Других решений пока нет …