提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:thinkphp中使用Elasticsearch 7.0进行多表的搜索:
thinkphp数据库配置文件
// Elasticsearch数据库配置信息
'elasticsearch' => [
'scheme' =>'http',
'host' => '127.0.0.1',
'port' => '9200',
'user' => '',
'pass' => '',
'timeout' => 2,
],
提示:以下是本篇文章正文内容,下面案例可供参考
示例:thinkphp中使用Elasticsearch 7.0进行多表的搜索
直接上代码如下(示例):
composer require "elasticsearch/elasticsearch": "7.0.*"
代码如下(示例):
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;
}
}
/**
* 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;
}
}
/**
* 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;
}
}
/**
* 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的使用