加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 弹性搜索模糊匹配,首先显示精确匹配

发布时间:2020-12-13 17:30:54 所属栏目:PHP教程 来源:网络整理
导读:我想在查询上使用模糊匹配,但在结果的顶部显示完全匹配. 我尝试了以下内容. $return = $this-_client-search( array( 'index' = self::INDEX,'type' = self::TYPE,'body' = array( 'query' = array( 'bool' = array( 'must' = array( 'multi_match' = array(
我想在查询上使用模糊匹配,但在结果的顶部显示完全匹配.

我尝试了以下内容.

$return = $this->_client->search(
            array(
                'index' => self::INDEX,'type'  => self::TYPE,'body'  => array(
                    'query' => array(
                        'bool' => array(
                            'must' => array(
                                'multi_match' => array(
                                    'query'     => $query,'fields'    => array('name','brand','description'),'boost'     => 10,),'fuzzy_like_this' => array(
                                    'like_text' => $query,'fuzziness' => 1,'size' => '5000',)
        );

由于格式错误的查询错误,这不起作用.

有任何想法吗?

解决方法

我最终没有使用模糊匹配来解决我的问题,而是使用了ngram的.

/**
 * Map - Create a new index with property mapping
 */
public function map()
{
    $params['index'] = self::INDEX;

    $params['body']['settings'] = array(
        'index' => array(
            'analysis' => array(
                'analyzer' => array(
                    'product_analyzer' => array(
                        'type'      => 'custom','tokenizer' => 'whitespace','filter'    => array('lowercase','product_ngram'),'filter' =>  array(
                    'product_ngram' => array(
                        'type' => 'nGram','min_gram' => 3,'max_gram' => 5,)
            ),)
    );

    //all the beans
    $mapping = array(
        '_source'    => array(
            'enabled' => true
        ),'properties' => array(
            'id'          => array(
                'type' => 'string','name'        => array(
                'type'     => 'string','analyzer' => 'product_analyzer','boost'    => '10','brand'       => array(
                'type' => 'string','boost'    => '5','description' => array(
                'type' => 'string','barcodes'    => array(
                'type' => 'string'
            ),);

    $params['body']['mappings'][self::TYPE] = $mapping;

    $this->_client->indices()->create($params);
}


public function search($query)
{
    $return = $this->_client->search(
        array(
            'index' => self::INDEX,'body'  => array(
                'query' => array(
                    'multi_match' => array(
                        'query'  => $query,'fields' => array('id','name','description','barcodes'),)
    );

    $productIds = array();

    if (!empty($return['hits']['hits'])) {
        foreach ($return['hits']['hits'] as $hit) {
            $productIds[] = $hit['_id'];
        }
    }

    return $productIds;
}

结果正是我所寻找的.它根据搜索查询中包含的ngram部分构造匹配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读