elasticsearch - 任何领域的所有术语

elasticsearch - all terms in any fields

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

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

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

这有一个烦人的行为:

查询 "notebook" 查找包含该术语的所有产品。 但是查询 "note book" 什么也找不到。

也许通配符查询无论如何都不是最佳做法。

我需要的:

最好的方法是什么?

我试过 MultiMatchQuery 类型 best_fieldsphrase_prefixSHOULD/MUST 的组合,但要么结果有太多不相关的结果,要么 none完全没有。

感谢您的宝贵时间。

找到解决方案:

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

我猜前导通配符并不理想,但像这样工作得很好。完全没有性能问题。