# elasticsearch 简介
```
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,
并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
```
# 1 elasticsearch 的安装
> 安装Java环境 首先检测是否安装java
```
java -version
echo $JAVA_HOME
```
> 如果java的版本过低,建议安装高版本,下面安装的是java 1.8
> 如果没有安装Java,执行下面步骤,已经安装了可直接跳过
```
1 进入 Oracle 官方网站 下载合适的 JDK 版本,准备安装。 地址 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
注意:这里需要下载 Linux 版本。这里以jdk-8u151-linux-x64.tar.gz为例,你下载的文件可能不是这个版本,这没关系,只要后缀(.tar.gz)一致即可。
2 在/usr/目录下创建java目录,
mkdir /usr/java
cd /usr/java
把下载的文件 jdk-8u151-linux-x64.tar.gz 放在/usr/java/目录下。
3 解压JDK
tar -zxvf jdk-8u151-linux-x64.tar.gz
4 设置环境变量
修改 /etc/profile
在 profile 文件中添加如下内容并保存:
set java environment
JAVA_HOME=/usr/java/jdk1.8.0_151
JRE_HOME=/usr/java/jdk1.8.0_151/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
注意:其中 JAVA_HOME, JRE_HOME 请根据自己的实际安装路径及 JDK 版本配置。
让修改生效: source /etc/profile
5 测试
java -version
显示 java 版本信息,则说明 JDK 安装成功:
```
# 2 下载安装 elasticsearch
```
cd /home
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.4.1/elasticsearch-2.4.1.zip
unzip elasticsearch-2.4.1.zip
mv /elasticsearch-2.4.1 /usr/local/elasticsearch
cd /usr/local
groupadd elasticsearch
useradd -g elasticsearch elasticsearch
chown elasticsearch:elasticsearch -R elasticsearch
需要说明的是elasticSearch直接从2,跳成了5版本,5版本刚出来不久,可能不稳定,我建议还是用2版本
```
# 2.1 设置开机启动
```
vim /etc/rc.d/rc.local
写入 su elasticsearch -c "/usr/local/elasticsearch/bin/elasticsearch -d"
一定要注意,elasticSearch不能用root账户启动,elasticSearch不能用root账户启动,elasticSearch不能用root账户启动,重要的说三遍。
```
# 2.2 配置
```
vim /usr/local/elasticsearch/config/elasticsearch.yml
修改如下:
cluster.name: TA-application
node.name: node-210
network.host: 192.168.0.210 //当前服务器的IP
其中cluster.name 是集群名称,这个不要使用默认的,要修改,去掉注释,如果有多个机器,加入同一个集群,那么这个值必须一样
noide.name 是集群里面每个节点的值,也就是当前机器的节点的值,这个值,每个节点要不一样。
network host 改成当前的内网ip
```
# 2.3 安装head 插件
```
su elasticsearch
cd /usr/local/elasticsearch
bin/plugin install mobz/elasticsearch-head
#启动:
bin/elasticsearch -d
```
# 2.4 验证查看
```
http://192.168.0.210:9200/
head插件地址:
http://192.168.0.210:9200/_plugin/head/
```
# 3 Yii2 使用elasticSearch
```
首先需要安装yii2的elasticSearch插件
php composer.phar require --prefer-dist yiisoft/yii2-elasticsearch:"~2.0.0"
```
# 3.1 Yii2 配置elasticSearch
```
在main.php里添加
return [
//....
'components' => [
'elasticsearch' => [
'class' => 'yii\elasticsearch\Connection',
'nodes' => [
['http_address' => '127.0.0.1:9200'],
// configure more hosts if you have a cluster
],
],
]
];
```
# 3.1 Yii2 代码使用elasticSearch
```
1、建立model
/**
* NewsContent.php
* 文件描述
* Created on 2019-11-14 10:16
* Created by HuiLi
*/
namespace backend\models;
use Yii;
use yii\elasticsearch\ActiveRecord;
class ContentSearch extends ActiveRecord
{
//需要返回的字段
public function attributes()
{
return ['news_id','content']; //其实这里就是你要查询的字段,你要查什么写什么字段就好了
}
//索引
public static function index()
{
return 'content_search_news_id';
}
//文档类型
public static function type()
{
return 'content_search';
}
//这个就是第二步配置的组件的名字(key值)
public static function getDb()
{
return \Yii::$app->get('elasticsearch');
}
}
2、控制器的使用
//添加数据
public function actionIndex(){
$Es = new ContentSearch();
$news_id = '1';
$news_id = '内容';
$Es->news_id = $news_id;
$Es->content = $news_id;
$Es->save();
}
//查询数据
适用场景的查询
1 时间范围搜索,xxx是你要搜的字段,start是开始时间,end是结束时间,注意xxx的字段类型一定是date,xxx和start,end结构一致;
$query_arr = [
"bool" => [
"filter" => [
"range" => [
"xxx" => [
"from" => $start,
"to" => $end
]
]
]
],
];
2 单关键词搜索,你只需要讲match对应你要搜索的数组就可以
$query_arr = [
"bool" => [
"must" => [
"match" => ["name"=>"bht"]
]
],
];
3 关键词搜索,should相当于or,如果想用and,可以改成must
$query_arr = [
"bool" => [
"should" => [
['match' => ["name" => "bht"]],
['match' => ["sex" => "男"]],
['match' => ["age" => "24"]],
['match' => ["add" => "山东济南"]]
],
],
];
4 范围搜索,对于数字,用gl(great than大于) , lt(less than) , gle(大于等于),lte(小于等于)
$query_arr = [
"bool" => [
"filter" => [
"range" => [
"xxx" => [
"gle" => 10,
"lte" => 20
]
]
]
],
];
5 排序 desc和asc
$sort = ['xxx' => ['order' => 'desc']]
以上条件写好后,按照如下,就可以搜索了
$merge = new Merge();
$merge::find()->query($query_arr)->orderBy($sort)->asArray()->all()
但是搜索出来的数目只有10条,如果你的数据多于10条,请加limit(你想显示的条数)
query->orderBy($sort)->asArray()->limit(100)->all()
```