asticsearch — все термины в любых областях

Для функции поиска в интернет-магазине я использую 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 комбинация, но либо результат имеет слишком много не относящихся к делу результатов, либо их вообще нет.

Спасибо за ваше время.

0

Решение

разобрался с решением:

$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);
}

Думаю, ведущий символ подстановки не идеален, но он отлично работает. Никаких проблем с производительностью вообще.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]