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

news2025/1/24 14:45:18

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

文章目录

  • 前言
  • 一、thinkphp中使用Elasticsearch 7.0进行多表的搜索
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

提示: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;
    }
}
<?php
/**
 * Created by PhpStorm.
 * User: wangkxin@foxmail.com
 * Date: 2023/9/2
 * Time: 17:55
 */

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;
    }
}
<?php
/**
 * Created by PhpStorm.
 * User: wangkxin@foxmail.com
 * Date: 2023/9/2
 * Time: 15:27
 * 全局搜素模型
 */

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;
    }


}
<?php
/**
 * Created by PhpStorm.
 * User: wangkxin@foxmail.com
 * Date: 2023/9/2
 * Time: 18:53
 */

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的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/965629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stable diffusion实践操作-批次出图

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、批次出图介绍1.1 webUI设置1.2 参数介绍 二、批次出图使用2.1 如何设置2.1 效果展示 总结 前言 本章主要介绍SD批次出图。 想要一次产生多张图片的时候使用。 一、批次出图介绍 1.1 webUI设置 1.2 参数…

[管理与领导-65]:IT基层管理者 - 辅助技能 - 4- 乌卡时代(VUCA )

前言&#xff1a; 大多数IT人&#xff0c;很勤奋&#xff0c;但都没有职业规划&#xff0c;被工作驱动着前行&#xff0c;然而&#xff0c;作为管理者&#xff0c;你就不能没有职业规划思维&#xff0c;因为你代表一个团队&#xff0c;你的思维决定了一个团队的思维。本文探讨…

2023-9-2 染色法判定二分图

题目链接&#xff1a;染色法判定二分图 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 100010l, M 200010;int n, m; int h[N], e[M], ne[M], idx;int color[N];void add(int a, int b) {e[idx] b, ne[id…

CSS中border-radius的来美化table的实战方案

border-radius是一种CSS属性&#xff0c;用于设置元素的边框的圆角程度。其具体的用法如下&#xff1a; 设置一个值&#xff1a;可以为元素设置一个单一的圆角半径&#xff0c;这个半径将应用于元素的四个角。例如&#xff1a; div {border-radius: 10px; }设置四个值&#x…

vue Cesium接入在线地图

Cesium接入在线地图只需在创建时将imageryProvider属性换为在线地图的地址即可。 目录 天地图 OSM地图 ArcGIS 地图 谷歌影像地图 天地图 //矢量服务let imageryProvider new Cesium.WebMapTileServiceImageryProvider({url: "http://t0.tianditu.com/vec_w/wmts?s…

创建性-构造者设计模式

前言 我们在使用Retrofit等这些第三方框架的时候&#xff0c;发现他们的使用都很方便&#xff0c;比如Retrofit retrofit new Retrofit.Builder().build()&#xff0c;和我们通常直接new一个对象不同&#xff0c;他是交给Builder类&#xff0c;通过build()函数来构造一个Retro…

解决Ubuntu 或Debian apt-get IPv6问题:如何设置仅使用IPv4

文章目录 解决Ubuntu 或Debian apt-get IPv6问题&#xff1a;如何设置仅使用IPv4 解决Ubuntu 或Debian apt-get IPv6问题&#xff1a;如何设置仅使用IPv4 背景&#xff1a; 在Ubuntu 22.04(包括 20.04 18.04 等版本) 或 Debian (10、11、12)系统中&#xff0c;当你使用apt up…

JS中的new操作符

文章目录 JS中的new操作符一、什么是new&#xff1f;二、new经历了什么过程&#xff1f;三、new的过程分析四、总结 JS中的new操作符 参考&#xff1a;https://www.cnblogs.com/buildnewhomeland/p/12797537.html 一、什么是new&#xff1f; 在JS中&#xff0c;new的作用是通过…

【分类】分类性能评价

评价指标 1、准确率、召回率、精确率、F-度量、ROC ​ 属于各类的样本的并不是均一分布&#xff0c;甚至其出现概率相差很多个数量级&#xff0c;这种分类问题称为不平衡类问题。在不平衡类问题中&#xff0c;准确率并没有多大意义&#xff0c;我们需要一些别的指标。 ​ 通…

PYTHON知识点学习-函数(下)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由 Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

Mac安装brew、mysql、redis

mac安装brew mac安装brewmac安装mysql并配置开机启动mac安装redis并配置开机启动 mac安装brew 第一步&#xff1a;执行. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"第二步&#xff1a;输入开机密码 第三…

element+vue table表格全部数据和已选数据联动

1.组件TableChoose <template><div class"tableChooseBox"><div class"tableRow"><div class"tableCard"><div class"tableHeadTip">全部{{ labelTitle }}</div><slot name"body" …

《奥本海默》热映,Sam Altman 会是下个他吗?

撰文&#xff1a;Nathan Gardels 来源&#xff1a;Noema 治理可能摧毁社会的技术。 图片来源&#xff1a;由无界AI生成 电影导演克里斯托弗 - 诺兰&#xff08;Christopher Nolan&#xff09;说&#xff0c;他曾与正在经历“奥本海默时刻”的人工智能科学家交谈过&#xff0c;他…

JavaScript 实现树形结构和一维数组互相转换

背景 树形结构和一维数组是开发中很容易碰到的情况&#xff0c;也是面试中很容易碰到的手撕题目 实现 一、一维数组转树形结构 FROM const source [{ id: 1, name: "张三", pid: 0 },{ id: 2, name: "李四", pid: 1 },{ id: 3, name: "王五&qu…

【【STM32--28--IO引脚的复用功能】】

STM32–28–IO引脚的复用功能 STM32的IO复用功能 何为复用? 我们先了解一下何为通用 IO端口的输入或输出是由GPIO外设控制&#xff0c;我们称之为通用 复用&#xff1a; IO端口的输入或者是输出是由其他非GPIO外设控制就像经常说的USART 由 DR寄存器进行输出 STM32的IO复用功…

Python学习教程:集合操作的详细教程

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 Python中有两种可以遍历的容器类型&#xff1a; 序列类型&#xff1a;包含字符串、列表、元祖 序列类型是线性表&#xff0c;就像数组一样&#xff0c;是在内存中开辟一块连续空间&#xff0c;连续存储的&#xff0c; 那么查找…

前端vue3+ts架构

1、vue creat 项目名称 选择自定义 选择需要的依赖 选择vue3 一路enter&#xff0c;选择eslistprettier 继续enter&#xff0c;等待安装 按步骤操作&#xff0c;项目启动成功 2、vscode安装5款插件 2、代码保存自动格式化&#xff0c;保证每个开发人员代码一致&#xff0c;根目…

震惊!靠「职业骗薪」,在上海买了别墅

昨天在知乎热榜上看到一条新闻&#xff0c;震惊之余&#xff0c;也有点可叹可悲的感觉。 根据经济观察报的报道&#xff1a;职业骗薪者&#xff0c;3 年在沪买别墅&#xff0c;同时供职 16 家公司却从不上班&#xff0c;落网时她还在面试。 新闻上说&#xff1a;管悦被警察抓获…

Bert和LSTM:情绪分类中的表现

一、说明 这篇文章的目的是评估和比较 2 种深度学习算法&#xff08;BERT 和 LSTM&#xff09;在情感分析中进行二元分类的性能。评估将侧重于两个关键指标&#xff1a;准确性&#xff08;衡量整体分类性能&#xff09;和训练时间&#xff08;评估每种算法的效率&#xff09;。…

OpenCV(十六):高斯图像金字塔

目录 1.高斯图像金字塔原理 2.高斯图像金字塔实现 1.高斯图像金字塔原理 高斯图像金字塔是一种用于多尺度图像表示和处理的重要技术。它通过对图像进行多次高斯模糊和下采样操作来生成不同分辨率的图像层级&#xff0c;每个层级都是原始图像的模糊和降采样版本。 以下是高斯…