Yii2整合Elasticsearch(一)
背景知識:
- 全文搜尋可以簡單地分為兩類,一種是順序掃描,即我們常見的使用 like %keyword% 方式,掃描整張資料表,在每一條記錄中查詢;另一種就是索引掃描。elasticsearch就是後者。
- 索引掃描分為兩部分:建立索引和搜尋索引。建立索引的主要步驟是:對原資料進行分詞處理(去掉標點和一些無意義的詞等等),將得到的詞元交給語言處理元件(例如將複數變為單數,將過去式變為一般式等等),最後再將詞元交給索引元件建立索引。搜尋索引的主要步驟:對使用者輸入的內容進行分詞語言等處理之後,根據詞元搜尋索引,找到對應的文件id,再根據文件id獲得結果。
- logstash可以理解為是一個管道,資料從輸入端傳輸到輸出端,當然你還可以在管道中防止一些濾網來過濾資料,感興趣的讀者可以詳細瞭解一下。
- 在使用ES的時候,注意版本,因為版本和版本之間的差距還是很大的
- 在操作ES的時候可以考慮使用官方的視覺化工具kibana,或者使用postman,curl命令,當然也可以使用elasticsearch-head,github主頁。
- 本文基於蘋果系統做介紹。
1.安裝elasticsearch,首先需要有java環境,java環境下載,其次在命令列執行如下指令即可:
java -version #檢視安裝好的java版本
brew install elasticsearch #使用mac自帶的包管理安裝
2.接著我們需要安裝中文分片語件,ik分詞github主頁
根據以上資訊得知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:
- ES的系列教程:https://blog.csdn.net/column/details/18392.html
- ES系列教程:https://www.cnblogs.com/ljhdo/p/4981928.html
- ES的幾個核心概念:https://blog.csdn.net/tree_java/article/details/70214636
- 關於分片的嘮嗑:https://blog.csdn.net/alan_liuyue/article/details/79585345
在之後的一篇文章中將介紹如何將ES整合到Yii2中。