laravel简单使用 ES与ik分词 进行搜索功能

参考mysql的表结构与部分数据
在这里插入图片描述
laravel引入Elasticsearch

composer require elasticsearch/elasticsearch:7.16.0

1.ES初始化

use Elasticsearch\ClientBuilder;

private function _init_es()
    {
        $hosts = ['127.0.0.1:9200'];
        $client = ClientBuilder::create()->setHosts($hosts)->build();
        return $client;
    }
  1. 创建索引
private function createIndex()
    {
        //初始化一个es
        $client = $this->_init_es();
        $params = [
            'index' => 'article', //索引的名称(mysql的表名)
            'body' => [
                'settings' => [
                    'number_of_shards' => 5,//设置数据的分片数,默认为5
                    'number_of_replicas' => 0,//备份数,单个es服务器无需备份
                ],
                'mappings' => [
                    'properties' => [
                        'id' => [
                            'type' => 'integer'
                        ],
                        'title' => [
                            'type' => 'text', //text类型,做模糊搜索用
                            'analyzer'=>'ik_max_word',//较细粒度分词,写入数据用  需要安装ik并将ik放入es的plugin中
                            'search_analyzer'=>'ik_smart',//较细粒度分词,查询数据用  需要安装ik并将ik放入es的plugins中
                        ],
                        'descs' => [
                            'type' => 'keyword' //keyword类型 做精确搜索用
                        ],
                    ],
                ],
            ],
        ];
        $response = $client->indices()->create($params);
        return $response;
    }
  1. 写入数据
private function inserUpdate($data)
    {
        $client = $this->_init_es();

        foreach ($data as &$item) {
            $params = [
                'index' => 'article',
                'type' => '_doc',
                'id' => $item->id,
                'body' => [
                    'id' => $item->id,
                    'title' => $item->title,
                    'descs' => $item->descs,
                ],
            ];
            $rs = $client -> index($params);
            var_dump($rs);
        }

//        var_dump($rs);
        return true;
    }

  1. 查询数据
private function doSearch($keywords){
        $esWhere = [];
        //如果需要 同时满足多个查询条件(and查询),则复制下面参数,改title为 descs即可
        $esWhere['bool']['must'][] = [
            'match_phrase' => [
                'title' =>$keywords
            ]
        ];

        /*
          $esWhere['bool']['must'][] = [
            'match_phrase' => [
                'descs' =>$keywords
            ]
        ];
        */

        //按id排序
        $sortOrder = ['id'=>'asc'];

        $where = [
            'index'=>'article',
            'size'=>10,
            'from'=>0,
            'type'=>'_doc',
            'body' => [
                'query' =>$esWhere,//查询条件
                'sort' =>$sortOrder,//排序条件,注意 添加后 返回结果 无_score值
                'highlight' => [ //将查询的数据进行高亮显示
                    'fields' => [
                        'title' => [
                            'pre_tags' =>['<span style="color: red">'],
                            'post_tags' =>['</span>'],
                        ]
                    ]
                ]
            ]
        ];

        $client = $this->_init_es();
        $rs = $client->search($where);
        return $rs;
    }

5.删除数据

 private function deleteData ($id) {
        $client = $this->_init_es();
        $client->delete(['index'=>'article', 'id'=>$id]);
    }
  1. 删除索引
 private function deleteIndex () {
        $client = $this->_init_es();
        $client->indices()->delete(['index'=>'article']);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值