文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

thinkphp中使用Elasticsearch 7.0进行多表的搜索

2023-09-11 19:15

关注

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:thinkphp中使用Elasticsearch 7.0进行多表的搜索:

thinkphp数据库配置文件

 // Elasticsearch数据库配置信息        'elasticsearch' => [            'scheme' =>'http',            'host' => '127.0.0.1',            'port' => '9200',            'user' => '',            'pass' => '',            'timeout' => 2,        ],

提示:以下是本篇文章正文内容,下面案例可供参考

一、thinkphp中使用Elasticsearch 7.0进行多表的搜索

示例:thinkphp中使用Elasticsearch 7.0进行多表的搜索

二、使用步骤

1.引入库

直接上代码如下(示例):

composer require "elasticsearch/elasticsearch": "7.0.*"

2.读入数据

代码如下(示例):

namespace app\common\model;use think\facade\Db;use think\Model;use Elasticsearch\ClientBuilder;class Article extends Model{    protected $client;    public function __construct($data = [])    {        parent::__construct($data);        try {            $this->client = ClientBuilder::create()                ->setHosts([config('database.connections.elasticsearch.host') . ':' . config('database.connections.elasticsearch.port')])                ->build();        } catch (\Exception $e) {            // 输出连接错误信息            echo $e->getMessage();            exit;        }    }    // 添加文档到Elasticsearch    public function addDocument()    {        $articles = Db::name('article')->select();        foreach ($articles as $article) {            $data = [                'id' => $article['id'], // 文章表的 ID                'title' => $article['title'],                'content' => $article['content'],                'category_id' => $article['category_id'], // 文章表的 ID            ];            $params = [                'index' => 'articles', // 索引名称                'id' => $data['id'], // 文章 ID 作为文档的唯一标识                'body' => $data,            ];            $response = $this->client->index($params);        }        return $response;    }    // 搜索文档    public function searchDocuments($index,$query)    {        $params = [            'index' => $index,            'body' => [                'query' => [                    'multi_match' => [                        'query' => $query,                        'fields' => ['title', 'content'],                    ],                ],            ],        ];        $response = $this->client->search($params);        return $response;    }}
namespace app\common\model;use think\facade\Db;use think\Model;use Elasticsearch\ClientBuilder;class Book extends Model{    protected $client;    public function __construct($data = [])    {        parent::__construct($data);        try {            // $host = config('database.connections.elasticsearch.host');            // $port = config('database.connections.elasticsearch.port');            $this->client = ClientBuilder::create()                ->setHosts([config('database.connections.elasticsearch.host') . ':' . config('database.connections.elasticsearch.port')])                ->build();        } catch (\Exception $e) {            // 输出连接错误信息            echo $e->getMessage();            exit;        }    }    // 添加文档到Elasticsearch    public function addDocument()    {        $books = Db::name('book')->select();        foreach ($books as $book) {            $data = [                'id' => $book['id'], // 书籍表的 ID                'user_id' => $book['user_id'], // 书籍表作者ID                'book' => $book['book'],            ];            $params = [                'index' => 'books', // 索引名称                'id' => $data['id'], // 文章 ID 作为文档的唯一标识                'body' => $data,            ];            $response = $this->client->index($params);        }        return $response;    }    // 搜索文档    public function searchDocuments($index,$query)    {        $params = [            'index' => $index,            'body' => [                'query' => [                    'multi_match' => [                        'query' => $query,                        'fields' => ['book'],                    ],                ],            ],        ];        $response = $this->client->search($params);        return $response;    }}
namespace app\common\model;use think\Model;use Elasticsearch\ClientBuilder;class ElasticsearchModel extends Model{    protected $client;    public function __construct($data = [])    {        parent::__construct($data);        try {            $this->client = ClientBuilder::create()                ->setHosts([config('database.connections.elasticsearch.host') . ':' . config('database.connections.elasticsearch.port')])                ->build();        } catch (\Exception $e) {            // 输出连接错误信息            echo $e->getMessage();            exit;        }    }    public function globalSearch($keyword)    {        // 搜索articles索引        $articles = $this->searchIndex('articles', $keyword);        // 搜索books索引        $books = $this->searchIndex('books', $keyword);        // 合并搜索结果        $result = array_merge($articles, $books);        return $result;    }    protected function searchIndex($index, $keyword)    {        $params = [            'index' => $index,            'body' => [                'query' => [                    'multi_match' => [                        'query' => $keyword,                        'fields' => ['title', 'content','book'],                    ],                ],            ],        ];        // 执行搜索请求        $response = $this->client->search($params);        // 解析结果        $result = [];        if (isset($response['hits']['hits'])) {            foreach ($response['hits']['hits'] as $hit) {                $result[] = $hit['_source'];                $result['index'] = $index;            }        }        return $result;    }}
namespace app\index\controller;use app\common\model\ElasticsearchModel;class SearchController{//全局搜索个表间的数据    public function search($keyword)    {        $searchModel = new ElasticsearchModel();        $result = $searchModel->globalSearch($keyword);        return json($result);    }}
namespace app\index\controller;use app\BaseController;use app\common\model\Article as ElasticArticle;use app\common\model\Book as ElasticBook;use app\Request;use Elasticsearch\ClientBuilder;class Demo1 extends BaseController{//新增索引,建议在模型中新增 ,删除, 修改 或者使用观察者模式更新ES索引 public function addDocument()    {        $elasticsearchArticle = new ElasticArticle();        $response = $elasticsearchArticle->addDocument();        $elasticsearchBook = new ElasticBook();        $response1 = $elasticsearchBook->addDocument();        return json($response);        // print_r(json($response));        // print_r(json($response1));    }     public function search(Request $request)    {        $keyword = $request->param('keyword');        $elasticsearchModel = new ElasticArticle();        $index = 'articles';        $query = '你';        $response = $elasticsearchModel->searchDocuments($index, $query);        return json($response);    }//单独搜搜书籍表    public function searchBook(Request $request)    {        $keyword = $request->param('keyword');        $elasticsearchModel = new ElasticBook();        $index = 'books';        $query = '巴黎';        $response = $elasticsearchModel->searchDocuments($index, $query);        return json($response);    }    public function deleteIndex()    {        $client = ClientBuilder::create()->build();        $params = [            'index' => 'my_index', // 索引名称        ];        $response = $client->indices()->delete($params);        if ($response['acknowledged']) {            return '索引删除成功';        } else {            return '索引删除失败';        }    }}

使用的表

CREATE TABLE `article` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `category_id` int(11) DEFAULT NULL,  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  `content` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=107 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;CREATE TABLE `book` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `user_id` int(11) DEFAULT NULL,  `book` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;CREATE TABLE `elasticsearch_model` (  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',  `model_name` varchar(255) NOT NULL DEFAULT '' COMMENT '模型名称',  `index_name` varchar(255) NOT NULL DEFAULT '' COMMENT '索引名称',  `created_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',  `updated_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',  PRIMARY KEY (`id`),  UNIQUE KEY `index_name_unique` (`index_name`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='Elasticsearch 模型配置表';

结果
在这里插入图片描述
在这里插入图片描述

windwos 上记住 安装 Elasticsearch 7.0 库, 和 kibana-7.0.0-windows-x86_64 图像管理工具
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

提示:这是简单例子, 注意’fields’ => [‘title’, ‘content’], 尝试使用搜索number型字段,索引报错, 貌似只支持txt类型字段搜索
例如:以上就是今天要讲的内容,本文仅仅简单介绍了Elasticsearch的使用

来源地址:https://blog.csdn.net/qq_27878777/article/details/132643924

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯