PHP下使用elasticsearch

# 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()

```

你可能感兴趣的:(服务器)