对于在线商店中的搜索功能,我使用的是ongr的elasticsearchDSL(git / docs)。
用于搜索产品名称的基本设置:
$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 :(得分: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);
}
领先的通配符不是理想的选择,但它可以像这样正常工作。完全没有性能问题。