Elasticsearch在thinkphp5中的使用增删改查(模糊查询批量查询)
Posted 骨子里的偏爱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch在thinkphp5中的使用增删改查(模糊查询批量查询)相关的知识,希望对你有一定的参考价值。
Elasticsearch在thinkphp5中的使用(模糊查询)
需要安装elasticsearch、elastic-header-master、kibana、analysis-ik四个包,如下图所示:(需要的包直接去github上搜索就可以,至于安装教程可以在csdn上搜,看好是按照在win还是linux上的,最主要的是按照会遇到很多问题,有钱首次安装会生成一个账号、密码、和code,记得保存在电脑上,首次启用kibaba时需要输入才可运行,记得安装好jdk>=1.8的版本,前提条件,所有安装的包都要对应相同的版本,否则在plugings中的ik重启就会失败)
注意:千万别去官网下载最新的,因为最新的那个下载后没有对应的ik中文,配置的话,我以后再写。也可以看别人的,我下载的是7.17.2的包,大于8的可能或多或少的出现问题。只针对于thinkphp5的Elasticsearch的增删改查。
一、创建索引
public function index()
$es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
$params = [
'index' => 'movies',//类似于库名
'body' => [
'settings' => [
'number_of_shards' => 3,
'number_of_replicas' => 2
],
'mappings' => [
'_source' => [
'enabled' => true
],
'properties' => [
'title' => [
'type' => 'text',
"analyzer" => "ik_max_word",
"search_analyzer" => "ik_max_word"
]
]
]
]
];
//执行创建
$r = $es->indices()->create($params);
dump($r);
二、索引中新增数据
public function add_movies_data()
$data = Movies::select();//查询数据
$res = (new Collection($data))->toArray();
$es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
foreach ($res as $k=>$v)
$params = [
'index' =>'movies',//索引
'type' =>'_doc',//表(额外需要注意的,这里是固定的写法)
'id' => $v['id'],//主键
'body' =>$v//数据
];
$r = $es->index($params);
echo 'success';
三、实现在Elasticsearch中数据的搜索(使得搜索的关键字高亮)
public function search_movies()
$word = input('word');//接收关键字
$page = input('page',1);//接收当前页(如果没接收到,默认是1)
$size = 5;//每页显示条数
$limit = ($page-1)*$size;//偏移量
$client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();//创建es实例
//设置查询的条件
$params = [
'index' => 'movies',//索引(类似于库)
//'type' => '_doc',
'body' => [
//查询内容
'query' => [
'match' => [//匹配
'title' => $word//匹配字段
]
],
'highlight' => [//高亮
'pre_tags' => ["<em style='color: red'>"],//样式自己写
'post_tags' => ["</em>"],
'fields' => [
"title" => new \\stdClass()
]
]
]
];
//分页限制
$params["size"] = $size;//每页显示条数
$params["from"] = $limit;//偏移量
$results = $client->search($params);//es搜索
foreach ($results['hits']['hits'] as $k=>$v)
$results['hits']['hits'][$k]['_source']['title'] = $v['highlight']['title'][0];
$data = array_column($results['hits']['hits'],'_source');
$arr['data'] = $data;//数据
$arr['page'] = $page;//当前页
$arr['total'] = $results['hits']['total']['value'];//总条数
$arr['last_page'] = ceil($results['hits']['total']['value']/$size);//总页数
print_r($arr);//剩下的就是前端展示的事情了
前端页面展示:
elasticsearch索引展示:
我将代码复制到此处:
Controller中的代码:
public function first()
$es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
$params = [
'index' => 'movies01',//类似于库名
'body' => [
'settings' => [
'number_of_shards' => 3,
'number_of_replicas' => 2
],
'mappings' => [
'_source' => [
'enabled' => true
],
'properties' => [
'title' => [
'type' => 'text',
"analyzer" => "ik_max_word",
"search_analyzer" => "ik_max_word"
],
'goods_name' => [//goods_name 文档名称 相当于mysql中的字段
'type' => 'text',//text文本
'analyzer' => 'ik_max_word',//analyzer 指定分词器为ik
'search_analyzer'=>'ik_max_word',//指定搜索时的分词器
],
'goods_logo' => [
'type' => 'text'
],
'goods_price' => [
'type' => 'text',//text文本
],
'goods_desc' => [
'type' => 'text',//text文本
'analyzer' => 'ik_max_word',//analyzer 指定分词器为ik
'search_analyzer'=>'ik_max_word'//指定搜索时的分词器
],
'goods_remark' => [
'type' => 'text',//text文本
'analyzer' => 'ik_max_word',//analyzer 指定分词器为ik
'search_analyzer'=>'ik_max_word'//指定搜索时的分词器
],
"news_source"=>[
"type"=>"text",
"fielddata"=>true]
]
]
]
];
//执行创建
$r = $es->indices()->create($params);
dump($r);
public function add_movies_data()
$data = Goods::select();//查询数据
$res = (new Collection($data))->toArray();
$es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
foreach ($res as $k=>$v)
$params = [
'index' =>'movies01',//索引
'type' =>'_doc',//表(额外需要注意的,这里是固定的写法)
'id' => $v['id'],//主键
'body' =>$v//数据
];
$r = $es->index($params);
echo 'success';
public function search_movies($word)
header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETE");
header("Access-Control-Allow-Headers:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding");
// $word = input('word');//接收关键字
$page = input('page',1);//接收当前页(如果没接收到,默认是1)
$size = 5;//每页显示条数
$limit = ($page-1)*$size;//偏移量
$client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();//创建es实例
//设置查询的条件
$params = [
'index' => 'movies01',//索引(类似于库)
//'type' => '_doc',
'body' => [
//查询内容
'query' => [
'match' => [//匹配
'title' => $word//匹配字段
]
],
'highlight' => [//高亮
'pre_tags' => ["<em style='color: red'>"],//样式自己写
'post_tags' => ["</em>"],
'fields' => [
"title" => new \\stdClass()
]
]
]
];
//分页限制
$params["size"] = $size;//每页显示条数
$params["from"] = $limit;//偏移量
$results = $client->search($params)->asArray();//es搜索
foreach ($results['hits']['hits'] as $k=>$v)
$results['hits']['hits'][$k]['_source']['title'] = $v['highlight']['title'][0];
$data = array_column($results['hits']['hits'],'_source');
$arr['data'] = $data;//数据
$arr['page'] = $page;//当前页
$arr['total'] = $results['hits']['total']['value'];//总条数
$arr['last_page'] = ceil($results['hits']['total']['value']/$size);//总页数
// print_r($arr);//剩下的就是前端展示的事情了
return json($arr);
// return view('index/index',compact('arr',$arr));
数据库数据展示:
前端代码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<title>xx信息查询</title>
<script src="https://code.jquery.com/jquery-3.1.1.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
<form>
<table id="table-search" width="80%" align="center" border="1">
<tr>
<td>输入关键字</td>
<td><input type="text" maxlength="50" name="word" id="word"></td>
</tr>
<td>
<input type="button" value="搜索" id="btSearch" class="ui right floated positive button btn-search"/>
</td>
</tr>
</table>
</form>
<br/>
<table id="table-result" width="80%" align="center" border="1">
<tr>
<th>货物名称</th>
<th>货物图标</th>
<th>货物价格</th>
<th>货物备注</th>
<th>分类</th>
</tr>
<tbody id="tbody-result">
</tbody>
</table>
</body>
<script>
$(function ()
$('#btSearch').click(function ()
var word = $('#word').val();
var tbody = window.document.getElementById("tbody-result");
$.ajax(
type: "post",
dataType: "json",
url: "http://www.el.com/index.php/index/index/search_movies?word="+word,
success: function (msg)
console.log(msg);
if (msg)
var str = "";
var data = msg.data;
for (i in data)
str += "<tr>" +
"<td align='center'>" + data[i].goods_name + "</td>" +
"<td align='center'>" + data[i].goods_logo + "</td>" +
"<td align='center'>" + data[i].goods_price + "</td>" +
"<td align='center'>" + data[i].goods_remark + "</td>" +
"<td align='center'>" + data[i].title + "</td>" +
"</tr>";
document.getElementById('tbody-result').innerHTML = str;
,
error: function ()
alert("查询失败")
);
);
);
</script>
</html>
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖
以上是关于Elasticsearch在thinkphp5中的使用增删改查(模糊查询批量查询)的主要内容,如果未能解决你的问题,请参考以下文章