1. 程式人生 > >Yii2整合Elasticsearch(一)

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中。