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

Для функции поиска в интернет-магазине я использую elasticsearchDSL от ongr (git / документы).

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

$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, но в результате либо слишком много нерелевантных результатов, либо вообще нет.

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


person Alex    schedule 05.09.2018    source источник
comment
elastic.co/guide/en/ elasticsearch/reference/current/ здесь ясно сказано, что подстановочный термин не должен начинаться с одного из подстановочных знаков * или ?.   -  person prakash tank    schedule 05.09.2018
comment
это правда, но сервер может справиться с этим   -  person Alex    schedule 05.09.2018


Ответы (1)


придумал решение:

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

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

person Alex    schedule 06.09.2018