elasticsearch-任何领域的所有术语

时间:2018-09-05 10:36:25

标签: php elasticsearch elasticsearch-dsl

对于在线商店中的搜索功能,我使用的是ongr的elasticsearchDSL(git / docs)。

用于搜索产品名称的基本设置:

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

这有一个令人讨厌的行为:

查询“笔记本”查找带有该词的所有产品。 但是查询“笔记本”一无所获。

也许通配符查询并不是最佳做法。

我需要什么:

  • 搜索多个字段(名称,描述,制造商)
  • 没有模糊性:在所有这些字段中查找所有搜索词

做到这一点的最佳方法是什么?

我尝试使用MultiMatchQuerybest_fieldsphrase_prefix组合的SHOULD/MUST,但是结果有太多无关的结果,或者根本没有。

感谢您的时间。

1 个答案:

答案 0 :(得分: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);
}

领先的通配符不是理想的选择,但它可以像这样正常工作。完全没有性能问题。