【问题标题】:elasticsearch - all terms in any fieldselasticsearch - 任何领域的所有术语
【发布时间】:2018-09-05 10:36:24
【问题描述】:

对于网店的搜索功能,我使用的是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”却一无所获。

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

我需要什么:

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

最好的方法是什么?

我尝试了MultiMatchQuerybest_fieldsphrase_prefixSHOULD/MUST 类型的组合,但结果要么有太多不相关的结果,要么根本没有。

感谢您的宝贵时间。

【问题讨论】:

标签: php elasticsearch elasticsearch-dsl


【解决方案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);
}

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

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多