Yii2集成Elasticsearch(一)

背景知识:

  1. 全文搜索可以简单地分为两类,一种是顺序扫描,即我们常见的使用 like %keyword% 方式,扫描整张数据表,在每一条记录中查找;另一种就是索引扫描。elasticsearch就是后者。
  2. 索引扫描分为两部分:创建索引和搜索索引。创建索引的主要步骤是:对原数据进行分词处理(去掉标点和一些无意义的词等等),将得到的词元交给语言处理组件(例如将复数变为单数,将过去式变为一般式等等),最后再将词元交给索引组件建立索引。搜索索引的主要步骤:对用户输入的内容进行分词语言等处理之后,根据词元搜索索引,找到对应的文档id,再根据文档id获得结果。
  3. logstash可以理解为是一个管道,数据从输入端传输到输出端,当然你还可以在管道中防止一些滤网来过滤数据,感兴趣的读者可以详细了解一下。
  4. 在使用ES的时候,注意版本,因为版本和版本之间的差距还是很大的
  5. 在操作ES的时候可以考虑使用官方的可视化工具kibana,或者使用postman,curl命令,当然也可以使用elasticsearch-head,github主页
  6. 本文基于苹果系统做介绍。

1.安装elasticsearch,首先需要有java环境,java环境下载,其次在命令行执行如下指令即可:

java -version   #查看安装好的java版本

brew install elasticsearch #使用mac自带的包管理安装

2.接着我们需要安装中文分词组件,ik分词github主页,选择与ES对应的版本进行安装:

根据以上信息得知ES的版本是6.2.4,因此执行如下命令安装IK:

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip

执行上述命令之后,我们可以查看ES的插件目录,看是否已经安装:

3.以上我们安装好了ES和IK分词,接下来就是使用了,先来看如下这段创建索引的配置:

{
  "settings":{

    #指定新索引的时候不会立即生效,5s之后刷新生效(默认是1s)
    "refresh_interval":"5s",

    #索引的分片,默认是5
    "number_of_shards":1,

    #设置副本,默认是1
    "number_of_replicas":1
  },
  "mappings":{

    #goods官方术语叫类型,可以理解为表,名字可以自定义,也可以定义多个
    "goods":{

      #动态映射:true/false/strict
      #true默认值,如果添加的文档中有字段没有在下面声明则动态进行映射
      #false则忽略,strict则报错
      "dynamic":false,
        
      "properties":{
        #声明字段,名字可以自定义
        "goods_id":{
          "type":"long"
        },
        "name":{
          "type":"text",
          "analyzer":"ik_max_word",
          "search_analyzer":"ik_max_word"
        },
        "descr":{
          "type":"text",
          "analyzer":"ik_max_word",
          "search_analyzer":"ik_max_word"
        }
      }
    }
  }
}

4.利用postman,使用上述配置新建一个名为yii的索引:

5.接着向yii索引中导入文档数据,这里我以mysql作为源进行导入。本来想着使用elasticsearch-jdbc的,jdbc的github主页,但是它最高只支持ES 2.3.4版本,因此我们使用ES官方提供的Logstash插件,选择与es对应的版本下载,除了下载Logstash之外我们还要下载连接mysql的jar包,jar包下载地址

6.进入到logstash的bin目录,新建mysql目录,并在目录中新建一个mysql.conf文件,填写如下的配置信息:

input {
    stdin{
    }
    jdbc {

      # 数据库连接信息
      jdbc_connection_string => "jdbc:mysql://localhost:3306/yii"

      # 用户名密码
      jdbc_user => "root"
      jdbc_password => ""

      # 刚下载的mysql-jar包的位置
      jdbc_driver_library => "/Users/weixin/Desktop/mysql-jar/mysql-connector-java-8.0.12.jar"
      # mysql的Driver
      jdbc_driver_class => "com.mysql.jdbc.Driver"

      jdbc_paging_enabled => "true"

      jdbc_page_size => "50000"
      #statement_filepath => "config-mysql/test02.sql"
      
      #文档的类型(选择mappings中定义的某一个类型即可)
      type => "goods"

      #sql,注意select的字段要与选择的类型中的properties定义的一致(sql可以使用别名)
      statement => "select id as goods_id,name,descr from goods "
      
      #计划任务,用于定时将mysql的数据导入到es中(做自动增量)
      schedule => "* * * * *"  
      
    }
output {
    elasticsearch {
        hosts => "127.0.0.1:9200"

        # 索引的名称(使用刚刚创建的索引)
        index => "yii"

        # 将数据表的主键和文档的id关联,一般都是这么做的
        document_id => "%{goods_id}"
    }
    stdout {
        codec => json_lines
    }
}

7.执行如下命令,即可将mysql的数据导入到ES的yii索引下的goods文档类型中:

#注意在bin目录下执行,该命令会加载mysql目录下所有.conf的文件
sudo ./logstash -f mysql/

8.在执行第七步的时候,可能会报一个错误:Rejecting mapping update to [yii] as the final mapping would have more than 1 type: [goods, doc],解决方案是将我们的文档类型goods改成doc,删除掉原来的索引,新建一个索引将goods换成doc其他不变,更新mysql.conf文件的type为doc,然后重新执行命令即可。具体原因可以查看这个博客:传送门

以上就是要和大家分享的一些简单的ES使用,此外推荐几个博客帮助我们更好的学习ES:

  1. ES的系列教程:https://blog.csdn.net/column/details/18392.html
  2. ES系列教程:https://www.cnblogs.com/ljhdo/p/4981928.html
  3. ES的几个核心概念:https://blog.csdn.net/tree_java/article/details/70214636
  4. 关于分片的唠嗑:https://blog.csdn.net/alan_liuyue/article/details/79585345

在之后的一篇文章中将介绍如何将ES集成到Yii2中。

猜你喜欢

转载自blog.csdn.net/wx145/article/details/83350011
今日推荐