本文重點:引擎分類、logstash、es、ik分詞器、head插件
搜索引擎分類
1.網站搜索:例如百度、谷歌等
2.站內搜索:個人網站搜索
ES相關概念
- 索引:相當於數據庫。
- 類型:相當於數據庫表。
- 文檔:相當於數據庫錶行。
安裝
訪問ES官網直接下載解壓,便可使用。解壓成功後,進入bin目錄,運行cmd,輸入elasticsearch命令,即可看到es運行了兩個端口,一個9200,一個9300,java連接es使用9300端口,除外都使用9200。
運行成功後,瀏覽器輸入http://localhost:9200,便可看到如下界面。
使用
1. 新建索引
例如我們要新建一個叫articleindex的索引,就以put
方式提交
http://localhost:9200/articleindex/
結果如下:
2.新建文檔
因爲類型是弱引用,所以直接在url後面跟類型。例如:
新建一個article類型
的文檔
:
POST: http://localhost:9200/articleindex/article
傳入數據:
{
"title":"es學習筆記",
"content":"es新建文檔"
}
返回結果:
3.查詢
例如我們要查詢剛剛創建的article類型的所有文檔,給url後面加上"_search"
:
GET: http://localhost:9200/articleindex/article/_search
查詢結果:
根據id查詢: GET: http://localhost:9200/articleindex/article/[要查詢的_id(前面不用加_search)]
根據title查詢:GET: http://localhost:9200/articleindex/article/_search?q=title:es學習筆記
模糊查詢: GET: http://localhost:9200/articleindex/article/_search?q=*es學習*
(模糊查詢要給查詢的詞加上"*要模糊查詢的詞*")
4.修改
修改的時候要帶上剛創建成功的"_id"
例如我們要修改剛創建的那一條數據:
PUT: http://localhost:9200/articleindex/article/AWYD_DQz08TyZe-Re1rv
請求體內容:
{
"title":"es學習筆記修改",
"content":"es修改"
}
返回結果:
注意:
如果修改的url的id後綴存在就是修改,否則視爲新創建:http://localhost:9200/articleindex/article/[要修改或者創建的_id]
5.刪除
例如刪除_id爲1的數據:
DELETE: http://localhost:9200/articleindex/article/1
返回結果:
Head插件
如果都是通過rest請求的方式使用es,未免太過麻煩,而且也不夠人性化。我們一般會使用圖形化界面來實現es的日常管理,最常用的就是Head插件。
下載解壓
- 下載head插件:http://github.com/mobz/elasticsearch-head
- 下載elasticsearch-head-master.zip
- 解壓到任意目錄,但是要和es的安裝目錄區分開來。
- 安裝node.js,安裝cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 將grunt安裝爲全局命令。Grunt是基於Node.js的項目構建工具。他可以自動運行你所設定的任務。
npm install -g grunt-cli
- 安裝依賴
進入Head插件的解壓目錄,根據該目錄下的pakage.json安裝依賴包
cnpm install
安裝完成之後,你會發現該目錄下會多一個node_modules包
- 啓動
進入Head的解壓目錄啓動Head,在命令提示符下輸入命令
grunt server
- 訪問
打開瀏覽器,輸入http://localhost:9100
- 點擊鏈接按鈕沒有任何反應,按F12發現有如下錯誤:
No ‘Access-Controller-Allow-Origin’ header is present on the requested resource
這個錯誤是由於es默認不允許跨域調用,而elasticsearch-head屬於前端工具,所以報錯。我們這個時候需要修改前端es的配置,讓其允許跨域訪問。
修改es的配置文件:elasticsearch.yml,增加以下兩句命令:
http.cors.enabled:true
http.cors.allow-origin:"*"
此步爲允許es跨域訪問,點擊鏈接即可看到相關信息。
Head工具使用
添加索引
查詢
- 根據索引查詢
- 新增、修改、刪除
輸入請求和之前在postman的增刪改類似,請參考上面的描述。
ik分詞器
ik分詞器主要是用來對用戶要搜索的文本按照一定的規則進行拆分
ik分詞器安裝
下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
- 將下載下來的壓縮包進行解壓,將解壓後的elasitcsearch文件夾重命名爲ik
- 將ik文件夾拷貝到elasticsearch/plugins目錄下
- 重新啓動es,即可加載IK分詞器
ik分詞器測試
ik提供了兩個分詞器算法:ik_smart和ik_max_word
其中ik_smart爲最少切分,ik_max_word爲最細粒度劃分
我們分別來試一下:
- ik_smart:在瀏覽器地址欄輸入地址
http://localhost:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序員
結果如下:
2. ik_max_word
在瀏覽器地址欄輸入地址
http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序員
結果如下:
自定義詞庫
有時候會有一些網絡用語新產生的詞彙,就需要將新的詞彙收錄到es服務器,這時候就需要用到收錄詞條。
進入ik/config文件夾下,創建一個custom.dic文件,通過可保存文件爲utf-8的文本編輯器打開,輸入“人艱不拆”,保存。在同目錄下打開IKAnalyzer.cfg.xml,在entry的ext_dice中輸入新加的custom.dic,然後保存之後並進行重啓es。
再重新在瀏覽器輸入:
http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=人艱不拆
此時分詞器會將“人艱不拆”作爲一個完整的詞彙進行分詞,而不是分爲4個單獨的詞。
代碼連接es
在POM.XML中添加
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
在application.yml中添加
spring:
data:
elasticsearch:
cluster-nodes:127.0.0.1:9300 #連接es的地址
創建相關實體類:
analyzer:分詞的時候按這個算法分詞(存儲用的)
searchAnalyzer:搜索的時候按這個算法分詞(搜索用的)
這兩個一般值一樣,確保按照分詞能搜索到
創建相關dao層,注意繼承ElasticsearchRepository接口就行
service層、controller層和一般代碼無二。
Logstash
什麼是Logstash?
Logstash是一個輕量級的日誌蒐集處理框架,可以方便的把分散的、多樣化的日誌蒐集起來,並進行自定義的處理,然後傳輸到指定的位置,比如某個服務器或者文件。
Logstash安裝與測試
將Logstash壓縮包解壓,進入bin目錄:
logstash -e 'input {stdin { }} output{stdout {} }'
控制檯輸入字符,隨後就有日誌輸出。
Mysql數據導入Elasticsearch
- 在logstash-5.6.8安裝目錄下創建文件夾mysqletc
- 文件夾下創建mysql.conf(名稱隨意),內容如下:
再將mysql-connect-java的jar拷入同目錄下。
input{
jdbc{
jdbc_connection_string=>"jdbc:mysql://127.0.0.1:3306/數據庫名稱?characterEncoding=utf-8"
jdbc_user=>"root"
jdbc_password=>"root"
jdbc_driver_library=>"當前路徑下mysql-connect-java的jar包的完整限定名"
jdbc_driver_class=>"com.mysql.jdbc.Driver"
#是否分頁
jdbc_paging_enabled=>"true"
#分頁條數
jdbc_page_size=>"50"
#以下對應着要執行的sql的絕對路徑
#statement_filepath=>""
statement=>"select id,其他字段 from 表名稱"
#定時任務 各字段含義(由左至右)分、時、天、月、年,全部爲*表示每分鐘都更新
schedule=>"* * * * *"
}
}
output{
elasticsearch{
#ES的IP地址與端口
hosts => "127.0.0.1:9200"
#ES索引名稱
index => "索引名稱"
#自增id編號,這個id對應上面數據庫sql查詢出來的id
document_id=>"%{id}"
#es類型
document_type=>""
}
stdout{
#以json格式輸出
codec => json_lines
}
}
然後命令提示符輸入以下命令,執行該conf文件,將數據庫內容導入es的索引庫。
logstash -f 該文件的路徑/mysql.conf
然後等待每分鐘執行刷新一次數據便可。
docker安裝ES
- 下載鏡像:
docker pull elastcisearch:5.6.8
- 創建容器
docker run -di --name=容器名稱 -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
- 瀏覽器驗證是否成功。
http://服務器url:9200
- es安裝在服務器的時候,9200可用,9300如果宿主機沒開啓的話,一般是不可用的,那麼如何解決9300不可用呢?
首先我們要進入docer創建的es容器,固定寫法:
docker exec -it 容器名稱 /bin/bash(內存中固定的路徑,這樣寫就行)
要解決9300不能訪問的問題就必須修改elasticsearch/config/elasticsearch.yml,但是在docker容器中是不能直接編輯(vi)的,所以必須用docker cp將該文件拷貝到宿主機,然後修改好之後再拷貝回去。
修改內容如下:
#意思是所有ip都可以訪問,如果要限定只有某個ip可以訪問,那麼將其改爲固定ip即可。
transport.host:0.0.0.0
- 開啓了所有ip訪問之後,會發現後臺啓動報錯,啓動不起來,這是什麼原因呢?是因爲宿主機軟硬件、內存不能支撐。所以我們還需要系統調優。
我們一共需要修改兩處地方:
5.1. 修改/etc/security/limits.conf,追加內容
* soft nofile 65536
* hard nofile 65536
nofile是單個進程允許打開的最大文件個數,softnofile是軟限制,hard nofile是硬限制
5.2. 修改/etc/sysctl.conf,追加內容
vm.max_map_count=655360
限制一個進程可以擁有的VMA(虛擬內存區域)的數量
執行下面命令,修改內核參數馬上生效
sysctl -p
注意: 複製上面的命令的時候,注意要將中文空格轉換爲英文的
- 重新啓動虛擬機,再次啓動容器,發現已經可以啓動並遠程訪問
> reboot #重啓虛擬機
> systemctl start docker #啓動docker服務
> docker images #查看虛擬機上所有的docker鏡像
> docker ps -a #查看虛擬機上 【已經運行/未運行】 的docker容器
> docker ps #查看虛擬機上已經運行的docker容器
docker安裝ik分詞器
將下載好的ik分詞器使用docker命令複製到es的plugins文件夾中,參考上面的ik學習。
docker安裝head插件
製作head鏡像,運行。參考上面的head插件初學。