Elasticsearch技术出现也有段时间了,一直很好奇想了解一下,利用周末时间了解熟悉一下;
Elasticsearch 是一个基于 Apache Lucene™ 的开源搜索引擎;Lucene 只是一个库;Elasticsearch 也是使用 Java 编写并使用 Lucene 来建立索引并实现搜索功能
分布式的实时文件存储,每个字段都被索引并可被搜索
实时分析的分布式搜索引擎
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
在安装Elasticsearch引擎之前,必须安装ES需要的软件环境,安装Java JDK和配置JAVA_HOME环境变量(我的电脑里JDK版本是1.8.1);我的PHP版本是7.2.1的;我下载的es版本是7.2
每次使用前开启ES;到目录:
C:\Users\Administrator\Downloads\elasticsearch-7.2.1-windows-x86_64\elasticsearch-7.2.1\bin 下面 双击启动elastaicsearch.bat (第二个)
用比较上手的Laravel框架去实践一下;laravel框架有专门的包来实现Elasticsearch ;
安装过程 可以详细看连接文档: https://www.pianshen.com/article/67441952280
启动ES后默认端口是9200:
用ES的index()方法循环导入了4562716条记录(之前导入过2万感觉和mysql的like查询没区别都是需要50ms左右);
Mysql记录:
搜索代码:
搜索的效率还是很快的:第一次可能慢点大概800ms,后面只需要几十毫秒(30~40毫秒);
mysql的like查询大概需要1.6s; 加索引没用因为like查询不会走索引
代码:============================
<?php
namespace App\Http\Controllers\Api;
use App\Entities\RandCode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ElastaicSearchController extends Controller
{
/**
* laravel-elastaicSearch
* @return \Illuminate\Http\JsonResponse
*/
public function add(Request $request)
{
set_time_limit(0);
ini_set('memory_limit', '2048M');
$client = \Elasticsearch\ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
//循环个45.6万条 效率如何
$res = [];
for($i = 0; $i < 4562716; $i++){
$generate_password = $this->generate_password(8);
$params = [];
$params = [
'index' => 'products',
'type' => 'es_testing',
'id' => $i,
'body' => [
'title' => $generate_password, //8位随机字符串
'description' => $i.'有关于ElasticSearch使用方法之谈',
'create_time' => now(),
],
];
$client->index($params);
\DB::insert("insert into rand_code(rand_code) values(?)",[$generate_password]);
}
echo '<pre>';
print_r('done');die;
}
//搜索
public function search(Request $request)
{
$where = [];
if($request->title)
{
$where["title"] = [
"query"=>$request->title,
"slop"=>20
];
}
if($request->description)
{
$where["description"] = [
"query"=>$request->description,
"slop"=>20
];
}
if($where)
{
$params = [
'index' => 'products',
'type' => 'es_testing',
'body' => [
'query' => [
'match_phrase' => $where
]
]
];
$hosts = [ '127.0.0.1:9200' ]; // IP + Port
$client = \Elasticsearch\ClientBuilder::create() // Instantiate a new ClientBuilder
->setHosts($hosts) // Set the hosts
->build();
$results = $client->search($params);
$products = $results['hits']['hits'];
}else{
$products = [];
}
echo '<pre>';
print_r($products);die;
}
function generate_password( $length = 10 ) {
// 密码字符集,可任意添加你需要的字符
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$password = '';
for ( $i = 0; $i < $length; $i++ )
{
$password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $password;
}
}
以上只是简单压测和练习一下,如有不足还请多指教