广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php+elasticsearch查询
  • 154
分享到

php+elasticsearch查询

2024-04-02 19:04:59 154人浏览 佚名
摘要

最近有些地方用到了搜索,但是搜索速度不达意所以使用 es 搜索,因此给自己做个标记,再这里做个记号,以后方便使用,以 windows 系统为例1. 华为开源镜像去下载 es 服务组件 :传送门:mirrors.huaweicloud.com

最近有些地方用到了搜索,但是搜索速度不达意所以使用 es 搜索,因此给自己做个标记,再这里做个记号,以后方便使用,以 windows 系统为例

1. 华为开源镜像去下载 es 服务组件 :传送门:mirrors.huaweicloud.com/

2. 下载 es 类

composer require 'elasticsearch/elasticsearch'

3. 下载 java jdk,具体下载地址也能再上面的华为开源镜像中下载,因为很方便的老铁们,注意 es 版本对应相应的 jdk

序号    Elasticsearch版本    JDK版本
1    Elasticsearch 5.0.x    OpenJDK/AdoptOpenJDK 8
2    Elasticsearch 5.1.x    OpenJDK/AdoptOpenJDK 8
3    Elasticsearch 5.2.x    OpenJDK/AdoptOpenJDK 8
4    Elasticsearch 5.3.x    OpenJDK/AdoptOpenJDK 8
5    Elasticsearch 5.4.x    OpenJDK/AdoptOpenJDK 8
6    Elasticsearch 5.5.x    OpenJDK/AdoptOpenJDK 8
7    Elasticsearch 5.6.x    OpenJDK/AdoptOpenJDK 8
8    Elasticsearch 6.0.x    OpenJDK/AdoptOpenJDK 8
9    Elasticsearch 6.1.x    OpenJDK/AdoptOpenJDK 8
10    Elasticsearch 6.2.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 9
11    Elasticsearch 6.3.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 10
12    Elasticsearch 6.4.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 10
13    Elasticsearch 6.5.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 11
14    Elasticsearch 6.6.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 11
15    Elasticsearch 6.7.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 11、OpenJDK 12
16    Elasticsearch 6.8.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK 12、OpenJDK/AdoptOpenJDK 13、OpenJDK/AdoptOpenJDK 14
17    Elasticsearch 7.0.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 11、OpenJDK 12
18    Elasticsearch 7.1.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 11、OpenJDK 12
19    Elasticsearch 7.2.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 11、OpenJDK 12
20    Elasticsearch 7.3.x    OpenJDK/AdoptOpenJDK 8、OpenJDK 11、OpenJDK 12
21    Elasticsearch 7.4.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 13
22    Elasticsearch 7.5.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 13
23    Elasticsearch 7.6.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 13
24    Elasticsearch 7.7.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 14
25    Elasticsearch 7.8.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 14
26    Elasticsearch 7.9.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 14
27    Elasticsearch 7.10.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 14
28    Elasticsearch 7.11.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 15
29    Elasticsearch 7.12.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 15、OpenJDK/AdoptOpenJDK 16
30    Elasticsearch 7.13.x    OpenJDK/AdoptOpenJDK 8、OpenJDK/AdoptOpenJDK 11、OpenJDK/AdoptOpenJDK 16

4. 启动 es 服务

两种方式:

  • 进入 es 安装目录使用命令启动 bin\elasticsearch

  • 或者直接进入 bin 文件双击 elasticsearch.bat 启动

要是看到这个页面就启动成功了

5. 浏览器查看 访问:localhost:9200/ 看到一下页面,恭喜你安装成功了。

6. 创建 ES 类

<?PHP

namespace App\Http\Controllers\api\Faninfo;



use Illuminate\Http\Request;
use App\Http\Controllers\Api\BaseController;
use Exception;

class EstestController extends BaseController
{


    private $client;
    const INDEX_NAME = 'test';      //  索引名称

    public function __construct()
    {
        $params = ['127.0.0.1:9200'];
        $this->client = \Elasticsearch\ClientBuilder::create()->setHosts($params)->build();
     }

    
    public function create_index() {

    try {    

        $params = [
            'index' => self::INDEX_NAME,
            'body' => [
                'settings' => [
                    'number_of_shards' => 5,   // 数据分片数,默认为5,有时候设置为3
                    'number_of_replicas' => 0  // 数据备份数,如果只有一台机器,设置为0
                ],
                'mappings'=>[
                    '_source' => [
                        'enabled' => true
                    ],
                    'properties' => [
                        'id' => [
                            'type' => 'integer',
                            'index' => false,  //index参数作用是控制当前字段是否被索引,默认为true,false表示不记录,即不可被搜索
                        ],
                        'title' => [
                            'type' => 'text', // text 类型的字符串是可以被全文检索的,它会被分词器作用,
                            'index' => true,
                            'analyzer' => 'ik_max_Word' // 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query
                        ],
                        'content' => [
                            'type' => 'text',
                            'index' => true,
                            'analyzer' => 'ik_max_word'
                        ],
                        'tags' => [   // 商品标签,字段被拆分后不具有意义,所以使用keyword 类型
                            'type' => 'keyword',
                        ],
                        'price' => [
                            'type' => 'float'
                        ],
                        'add_time' => [
                            'type' => 'integer',   // 时间戳
                        ],
                        'update_time' => [
                            'type' => 'integer',   // 时间戳
                        ]
                    ]
                ]
            ]
        ];
            return $this->client->indices()->create($params);

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

    
    public function delete_index() {
        $params = ['index' => self::INDEX_NAME];
        $response = $this->client->indices()->delete($params);
        return $response;
    }


    
    public function get_mapping() {
        $params = [
            'index' => self::INDEX_NAME,
        ];
        $response = $this->client->indices()->getMapping($params);
        return $response;
    }

    
    public function add_doc($id,$doc) {
        $params = [
            'index' => self::INDEX_NAME,
            'id' => $id,
            'body' => $doc
        ];
        $response = $this->client->index($params);
        return $response;
    }

    
    public function exists_doc($id = 1) {
        $params = [
            'index' => self::INDEX_NAME,
            'id' => $id
        ];
        $response = $this->client->exists($params);
        return $response;
    }

    
    public function get_doc($id = 1) {
        $params = [
            'index' => self::INDEX_NAME,
            'id' => $id
        ];
        $response = $this->client->get($params);
        return $response;
    }

    
    public function update_doc($id,$doc) {
        //在 Elasticsearch 中文档是 不可改变 的,不能修改它们。相反,如果想要更新现有的文档,需要 重建索引 或者进行替换, 我们可以使用相同的 index API 进行实现
        $params = [
            'index' => self::INDEX_NAME,
            'id' => $id,
            'body' => $doc
        ];
        $response = $this->client->index($params);
        return $response;
    }

    
    public function delete_doc($id = 1) {
        $params = [
            'index' => self::INDEX_NAME,
            'id' => $id
        ];
        $response = $this->client->delete($params);
        return $response;
    }

    // 查询文档 (分页,排序,权重,过滤)
    public function search_doc($keywords = "电脑",$from = 0,$size = 2) {
        $params = [
            'index' => self::INDEX_NAME,
            'body' => [
                'query' => [
                    'bool' => [
                        'should' => [
                            ['match' =>
                                [
                                    'title' => [
                                        'query' => $keywords,
                                        'boost' => 3, // 权重大
                                    ]
                                ]
                            ],
                            ['match' =>
                                [
                                    'content' => [
                                        'query' => $keywords,
                                        'boost' => 2,
                                    ]
                                ]
                            ],
                        ],
                    ],
                ],
                'sort' => [
                    'price'=>['order'=>'desc']
                ],
                'from' => $from,
                'size' => $size,
                // 高亮显示
                'highlight'=>[
                    "pre_tags" => ['<b style="color: red">'],
                    "post_tags" => ['</b>'],
                    'fields'=>[
                        'title'=>(object)[],
                        'content'=>(object)[]
                    ]
                ]
            ]
        ];
        $results = $this->client->search($params);
        return $results;
    }

    
    public function search_doc_fuzzy($keywords = "电脑",$from = 0,$size = 2) {
        $params = [
            'index' => self::INDEX_NAME,
            'body' => [
                'query' => [
                    'wildcard'=>[
                        'title'=>[
                            'value'=>$keywords.'*'
                        ]
                    ]
                ],
                'sort' => ['price'=>['order'=>'desc']]
                , 'from' => $from, 'size' => $size
            ]
        ];
        $results = $this->client->search($params);
        return $results;
    }





}

7. 调用 ES 类

public function create_index()
    {
        $es = new EstestController();
        $r = $es->create_index();
        // dd($r);
        if(isset($r['acknowledged']) === true){
            echo '索引创建成功';
        }
    }

    public function get_mapping()
    {
        $es = new EstestController();
        $r = $es->get_mapping();
        var_dump($r);die;
    }

    public function delete_index()
    {
        $es = new EstestController();
        $r = $es->delete_index();
        if(isset($r['acknowledged']) === true){
            echo '索引删除成功';
        }
    }

    public function add_doc()
    {
        $docs = [];
        $docs[] = ['id'=>1,'title'=>'苹果手机','content'=>'苹果手机,很好很强大。','tags'=>'手机,小米','price'=>9999.99,'add_time'=>1634712429,'update_time'=>0];
        $docs[] = ['id'=>2,'title'=>'华为手环','content'=>'荣耀手环,你值得拥有。','tags'=>'手环,华为','price'=>300,99,'add_time'=>1634712429,'update_time'=>0];
        $docs[] = ['id'=>3,'title'=>'小度音响','content'=>'智能生活,快乐每一天。','tags'=>'音响,小度','price'=>100,'add_time'=>1634712429,'update_time'=>0];
        $docs[] = ['id'=>4,'title'=>'王者荣耀','content'=>'游戏就玩王者荣耀,快乐生活,很好很强大。','tags'=>'游戏','price'=>998,'add_time'=>1634712429,'update_time'=>0];
        $docs[] = ['id'=>5,'title'=>'小汪糕点','content'=>'糕点就吃小汪,好吃看得见。','tags'=>'糕点,食物','price'=>98,'add_time'=>1634712429,'update_time'=>0];
        $docs[] = ['id'=>6,'title'=>'小米手环3','content'=>'秒杀限量,快来。','tags'=>'手环,小米','price'=>998,99,'add_time'=>1634712429,'update_time'=>0];
        $docs[] = ['id'=>7,'title'=>'iPad','content'=>'iPad,不一样的电脑。','tags'=>'iPad,苹果','price'=>2998,99,'add_time'=>1634712429,'update_time'=>0];
        $docs[] = ['id'=>8,'title'=>'中华人民共和国','content'=>'中华人民共和国,伟大的国家。','tags'=>'中华人民共和国,国家','price'=>19999,'add_time'=>1634712429,'update_time'=>0];
        $es = new EstestController();
        foreach ($docs as &$value){
            $es->add_doc($value['id'],$value);
        }
    }

    public function exists_doc()
    {
        $es = new EstestController();
        $r = $es->exists_doc(8);
        if($r){
            echo  '文档存在';
        }
    }

    public function get_doc()
    {
        // 注:如果文档不存在,会抛出Missing404Exception异常,建议先查询文档是否存在,再获取文档
        $es = new EstestController();
        $r = $es->get_doc(2);
        var_dump($r);
    }

    public function update_doc()
    {
        $es = new EstestController();
        $doc = ['id'=>1,'title'=>'苹果手机222','content'=>'苹果手机,很好很强大。','tags'=>'手机,苹果','price'=>9999.99,'add_time'=>1634712429,'update_time'=>1634712429];
        $r = $es->update_doc(1,$doc);
        var_dump($r);
    }

    public function delete_doc()
    {
        $es = new EstestController();
        $r = $es->delete_doc(8);
        var_dump($r);
    }

    
    public function search_doc(Request $request)
    {   $key = $request->key;
        $es = new EstestController();
        $r = $es->search_doc($key,0,3);
        // $r = $es->search_doc('手机',0,3);
        var_dump($r);
    }

    public function search_doc_fuzzy()
    {
        $es = new EstestController();
        $r = $es->search_doc_fuzzy('手',0,3);
        var_dump($r);
    }


--结束END--

本文标题: php+elasticsearch查询

本文链接: https://www.lsjlt.com/news/136078.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作