ELASTIC-PHP + IK分词器 + THINKPHP6 初次使用 (关键词查询)

环境:centos 6 php73 mysql56  ELASTIC7.71

1.安装elastic  使用华为云镜像更快哦 https://mirrors.huaweicloud.com/elasticsearch/

wget https://mirrors.huaweicloud.com/elasticsearch/7.7.1/elasticsearch-7.7.1-linux-x86_64.tar.gz

tar -zxvf elasticsearch-7.7.1-linux-x86_64.tar.gz 

2.添加用户(用户启动elastic 不能用root所以) 去目录里面编辑配置 elastic.yml

groupadd elastic
useradd -g elastic elastic
chown -R elastic.elastic /etc/elasticsearch-7.7.1
vim config/elasticsearch.yml 

  配置如下 注意冒号后有空格

------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: hxx-node-1
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data: /var/elastic/data
#
# Path to log files:
#
path.logs: /var/elastic/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 127.0.0.1
#
# Set a custom port for HTTP:
#
http.port: 9200
#
# For more information, consult the network module documentation.
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 127.0.0.1
#
# Set a custom port for HTTP:
#
http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.seed_hosts: ["host1", "host2"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["hxx-node-1"]

cluster.routing.allocation.disk.watermark.flood_stage: 99%
cluster.routing.allocation.disk.threshold_enabled: false

  3.安装ik分词库(用于中文)  下载对应的哦 7.7.1

https://github.com/medcl/elasticsearch-analysis-ik/releases

不管你用何种方法  放到安装路径里  /etc/elasticsearch-7.7.1/plugins/ik

好了 切换到 elastic 然后运行elastic

su elastic
./bin/elastic -d

 可进行测试

[root@iZuf64idor3ej85kby45arZ elasticsearch-7.7.1]# curl 127.0.0.1:9200
{
  "name" : "hxx-node-1",
  "cluster_name" : "hxx",
  "cluster_uuid" : "-43vGhX0Ru2ocVqNO7VhyA",
  "version" : {
    "number" : "7.7.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
    "build_date" : "2020-05-28T16:30:01.040088Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"

  二、PHP部分

1.composer 引入 elastic-php(使用phpstorm更方便)
 

"elasticsearch/elasticsearch": "~7.0",

  2.编辑elastic控制器类(包括 创建 增删改查 批量给导入)Ela.php

 

(1)执行index  后面查询执行search  

<?php


namespace app\index\controller;

use app\admin\model\Corporation;
use app\index\model\SystemUploadfile;
use app\common\controller\IndexController;
use app\common\service\MenuService;
use EasyAdmin\upload\Uploadfile;
use Elasticsearch\ClientBuilder;
use Elasticsearch\Common\Exceptions\BadRequest400Exception;
use Elasticsearch\Common\Exceptions\ElasticsearchException;
use Elasticsearch\Common\Exceptions\Missing404Exception;
use think\db\Query;
use think\facade\Cache;

class Ela extends IndexController
{

    private $client;

    // 构造函数
    public function __construct()
    {
        //$host = ['120.26.205.129:9200'];
        $host = ['127.0.0.1:9200'];
        $this->index = 'hcc_corporation';
        //$this->type = 'lyric';
        $this->client = ClientBuilder::create()->setHosts($host)->build();
    }

    // 初始化
    public function index()
    {


        // 只能创建一次


        $this->delete_index();

        $this->create_index(); //1.创建索引

        $this->create_mappings(); //2.创建文档模板



        /* foreach ($docs as $k => $v) {
             $this->add_doc($v['id'], $v); //3.添加文档
             echo '<pre>';
             print_r($this->get_doc($v['id']));
         }
         exit();*/
//        echo '<pre>';
//        print_r($this->get_doc(512));
//        exit();

//        $re = $this->search_doc("我做无敌",0,2); //4.搜索结果
//
//        echo '<pre>';
//        print_r($re);
//        exit();
        echo '<pre>';
        print_r("INIT OK");
        exit();
    }


    public function put_settings()
    {
        $params1 =
            [

                'index' => $this->index,
                'body' => [
                    'settings' => [
                        'blocks' =>
                            [
                                'read_only_allow_delete' => 'false'
                            ]
                    ],
                ]
            ];
        $this->client->indices()->putSettings($params1);
        echo 'SUCCESS';
    }

    // 创建索引

    public function create_index()
    { // 只能创建一次
        $params = [
            'index' => $this->index,
            'body' => [
                'settings' => [
                    'number_of_shards' => 3,
                    'number_of_replicas' => 2,
                    'blocks' =>
                        [
                            'read_only_allow_delete' => 'false'
                        ],
                    /*'transient' =>
                        [
                            'cluster' =>
                                [
                                    'routing' =>
                                        [
                                            'allocation' =>
                                                [
                                                    'disk' =>
                                                        [
                                                            'threshold_enabled' => 'true',
                                                            'watermark' =>
                                                                [
                                                                    'flood_stage' => '99%'
                                                                ]
                                                        ]
                                                ]
                                        ]
                                ]
                        ]*/
                ],
            ]
        ];


        try {


            $this->client->indices()->create($params);


        } catch (BadRequest400Exception $e) {
            $msg = $e->getMessage();
            $msg = json_decode($msg, true);
            return $msg;
        }
    }


    // 删除索引
    public function delete_index()
    {

        $params = ['index' => $this->index];
        $index = $this->client->indices()->get($params);

        if ($index) {
            return $this->client->indices()->delete($params);
        }

        //

    }

    // 创建文档模板
    public function create_mappings()
    {

        /*--------------------允许type的写法 老版本 已去除--------------------------*/


        /*--------------------不允许type的写法--------------------------*/
        // Set the index and type
        $params = [
            'index' => $this->index,
            'body' => [
                '_source' => [
                    'enabled' => true
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'name' => [
                        'type' => 'text',
                        'analyzer' => 'ik_smart'
                        // 'analyzer' => 'keyword'
                    ],

                    /*-------------------------------------*/

                    /*'profile' => [
                        'type' => 'text',
                        'analyzer' => 'ik_max_word'
                    ],
                    'age' => [
                        'type' => 'integer',
                    ],*/
                ]
            ]
        ];

        $this->client->indices()->putMapping($params);

        /*       echo '<pre>';
               print_r('success');
               exit();*/
    }

    // 查看映射
    public function get_mapping()
    {
        $params = [
            'index' => $this->index,
        ];
        $re = $this->client->indices()->getMapping($params);
        echo '<pre>';
        print_r($re);
        exit();

    }

    // 添加一个文档(记录)
    public function add_doc($id, $doc)
    {
        $params = [

            'index' => $this->index,
            //  'type' => $this->type,
            'id' => $id,
            'body' => $doc
        ];

        return $this->client->index($params);

    }

    // 判断文档(记录)
    public function exists_doc($id = 1)
    {
        $params = [
            'index' => $this->index,
            'type' => $this->type,
            'id' => $id
        ];

        return $this->client->exists($params);

    }

    // 获取一条文档(记录)
    public function get_doc($id = 1)
    {
        $params =
            [
                'index' => $this->index,
                // 'type' => $this->type,
                'id' => $id
            ];

        try {

            $re = $this->client->get($params);

        } catch (Missing404Exception $e) {

            echo '<pre>';
            print_r('未找到对应数据');
            exit();

        }

        echo '<pre>';
        print_r($re);
        exit();

    }

    // 更新一条文档()
    public function update_doc($id = 1)
    {
        // 可以灵活添加新字段,最好不要乱添加
        $params = [
            'index' => $this->index,
            'id' => $id,
            'body' => [
                'doc' => [
                    'name' => '大王'
                ]
            ]
        ];

        return $this->client->update($params);

    }

    // 删除一条文档()
    public function delete_doc($id = 1)
    {
        $params = [
            'index' => $this->index,
            //'type' => $this->type,
            'id' => $id
        ];

        return $this->client->delete($params);

    }

    // 查询文档 (分页,排序,权重,过滤)
    public function search_doc($keywords = "", $from = 0, $size = 10, $order = ['id' => ['order' => 'desc']])
    {

        /*   echo '<pre>';
           print_r($from);
           print_r($size);
           exit();*/
        $keywords_arr = array_filter(explode(" ", $keywords));
        $query = '';
        $number = count($keywords_arr);
        if($number > 10){
            return "ERROR";
        }
        if ($number > 1) {
            $arr = [];
            foreach ($keywords_arr as $ka){
                $arr[] = $ka;
            }
            $mathc_phrase = [];

            switch ($number){
                case 2:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1]
                        ];
                    break;
                case 3:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2]
                        ];
                    break;
                case 4:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2],
                            'name'=>$arr[3],
                        ];
                    break;
                case 5:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2],
                            'name'=>$arr[3],
                            'name'=>$arr[4],
                        ];
                    break;
                case 6:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2],
                            'name'=>$arr[3],
                            'name'=>$arr[4],
                            'name'=>$arr[5],
                        ];
                    break;
                case 7:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2],
                            'name'=>$arr[3],
                            'name'=>$arr[4],
                            'name'=>$arr[5],
                            'name'=>$arr[6],
                        ];
                    break;
                case 8:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2],
                            'name'=>$arr[3],
                            'name'=>$arr[4],
                            'name'=>$arr[5],
                            'name'=>$arr[6],
                            'name'=>$arr[7],
                        ];
                    break;
                case 9:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2],
                            'name'=>$arr[3],
                            'name'=>$arr[4],
                            'name'=>$arr[5],
                            'name'=>$arr[6],
                            'name'=>$arr[7],
                            'name'=>$arr[8],
                        ];
                    break;
                case 10:
                    $mathc_phrase =
                        [
                            'name'=>$arr[0],
                            'name'=>$arr[1],
                            'name'=>$arr[2],
                            'name'=>$arr[3],
                            'name'=>$arr[4],
                            'name'=>$arr[5],
                            'name'=>$arr[6],
                            'name'=>$arr[7],
                            'name'=>$arr[8],
                            'name'=>$arr[9],
                        ];
                    break;

            }

           // $should = [];
            /*foreach ($keywords_arr as $k => $keyword) {

                 //   $query .= $keyword . " OR ";
                $mathc_phrase[] = ['name'=>$keyword];

            }*/
          //  $query = substr($query,0,strlen($query)-3);

            $query_func = [
                'bool' =>
                    [
                        'must' =>
                            [
                                //$should

                                //$mathc_phrase
                                /*'query_string' =>
                                    [
                                        'default_field' => 'name',
                                        'query' => $query
                                    ]*/


                                'match_phrase'=>$mathc_phrase,
                               /*  'match_phrase'=>
                                [
                                    'name'=>'研究会',
                                ]*/
                            ]
                    ]


            ];
            /*echo '<pre>';
            print_r($query_func);
            exit();*/
        } else {
           // $query = $keywords;

            $query_func = [

                /*-----------------------------name 单字段单匹配---------------------------*/
                'bool' =>
                    [
                        'should' =>
                            [
                                'match_phrase' =>
                                    [
                                        'name' => $keywords
                                    ]
                            ]
                    ]

            ];
        }

        if ($keywords) {
            $params = [
                'index' => $this->index,
                //  'type' => $this->type,
                'body' => [
                    'query' => $query_func,

                    'sort' =>
                        [$order],
                    'from' => $from,
                    'size' => $size
                ]
            ];

        } else {
            $params = [
                'index' => $this->index,
                //  'type' => $this->type,
                'body' => [
                    /* 'query' => [
                         'match_all'=>[]
                     ],*/
                    'sort' => [$order]
                    , 'from' => $from, 'size' => $size
                ]
            ];
        }


        try {
            $re = $this->client->search($params);
        } catch (\Exception $e) {
            echo '<pre>';
            print_r($e->getMessage());
            exit();
        }


        return $re;
    }


    /**
     * 批量插入数据到索引
     */
    public function insertCorporation()
    {
        $corporations = Corporation::select();
        foreach ($corporations as $corporation) {

            $corporation = $corporation->toArray();

            $this->add_doc($corporation['id'], $corporation);
        }
        echo '<pre>';
        print_r('完成了');
        exit();
    }

}

  实际案例:http://www.huixx.cn/search/corporation.html?keyword=

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值