asticsearch - все термины в любых областях - PullRequest
0 голосов
/ 05 сентября 2018

Для функции поиска в онлайн-магазине я использую ongrasticsearchDSL ( git / docs ).

Базовая настройка для поиска названий продуктов:

$boolQuery = new BoolQuery();
$boolQuery->addParameter('minimum_should_match', 1);
$wcQuery = new WildcardQuery('name', "*$_term*");
$boolQuery->add($wcQuery, BoolQuery::MUST);

Это раздражает:

В запросе "Записная книжка" найдены все товары с этим термином. Но запрос «Записная книжка» вообще ничего не находит.

Возможно, подстановочный запрос в любом случае не лучшая практика.

Что мне нужно:

  • поиск по нескольким полям (название, описание, производитель)
  • no fuzzieness: найти все условия поиска в любом из этих полей

Какой лучший способ сделать это?

Я пробовал MultiMatchQuery с комбинациями типов best_fields и phrase_prefix и SHOULD/MUST, но либо у результата слишком много не относящихся к делу результатов, либо ни одного вообще.

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

1 Ответ

0 голосов
/ 06 сентября 2018

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

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

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

...