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_fields
和 phrase_prefix
和 SHOULD/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);
}
我猜前导通配符并不理想,但像这样工作得很好。完全没有性能问题。
对于在线商店中的搜索功能,我使用的是 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_fields
和 phrase_prefix
和 SHOULD/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);
}
我猜前导通配符并不理想,但像这样工作得很好。完全没有性能问题。