ElasticSearch學習筆記

本文重點:引擎分類、logstash、es、ik分詞器、head插件

搜索引擎分類

1.網站搜索:例如百度、谷歌等
2.站內搜索:個人網站搜索

ES相關概念

  1. 索引:相當於數據庫。
  2. 類型:相當於數據庫表。
  3. 文檔:相當於數據庫錶行。

安裝

訪問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插件。

下載解壓

  1. 下載head插件:http://github.com/mobz/elasticsearch-head
  2. 下載elasticsearch-head-master.zip
  3. 解壓到任意目錄,但是要和es的安裝目錄區分開來。
  4. 安裝node.js,安裝cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. 將grunt安裝爲全局命令。Grunt是基於Node.js的項目構建工具。他可以自動運行你所設定的任務。
npm install -g grunt-cli
  1. 安裝依賴
    進入Head插件的解壓目錄,根據該目錄下的pakage.json安裝依賴包
cnpm install

安裝完成之後,你會發現該目錄下會多一個node_modules包

  1. 啓動
    進入Head的解壓目錄啓動Head,在命令提示符下輸入命令
grunt server
  1. 訪問
    打開瀏覽器,輸入http://localhost:9100
    訪問head插件
  2. 點擊鏈接按鈕沒有任何反應,按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工具使用

添加索引

新建索引

查詢

  1. 根據索引查詢
    根據索引查詢
  2. 新增、修改、刪除
    輸入請求和之前在postman的增刪改類似,請參考上面的描述。
    增刪改

ik分詞器

ik分詞器主要是用來對用戶要搜索的文本按照一定的規則進行拆分

ik分詞器安裝

下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

  1. 將下載下來的壓縮包進行解壓,將解壓後的elasitcsearch文件夾重命名爲ik
  2. 將ik文件夾拷貝到elasticsearch/plugins目錄下
  3. 重新啓動es,即可加載IK分詞器

ik分詞器測試

ik提供了兩個分詞器算法:ik_smart和ik_max_word
其中ik_smart爲最少切分,ik_max_word爲最細粒度劃分
我們分別來試一下:

  1. ik_smart:在瀏覽器地址欄輸入地址
http://localhost:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序員

結果如下:
ik_smart分詞結果
2. ik_max_word
在瀏覽器地址欄輸入地址

http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序員

結果如下:
ik_max_word分詞結果

自定義詞庫

有時候會有一些網絡用語新產生的詞彙,就需要將新的詞彙收錄到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:搜索的時候按這個算法分詞(搜索用的)
這兩個一般值一樣,確保按照分詞能搜索到
es相關實體類
創建相關dao層,注意繼承ElasticsearchRepository接口就行
es創建dao層
service層、controller層和一般代碼無二。

Logstash

什麼是Logstash?

Logstash是一個輕量級的日誌蒐集處理框架,可以方便的把分散的、多樣化的日誌蒐集起來,並進行自定義的處理,然後傳輸到指定的位置,比如某個服務器或者文件。

Logstash安裝與測試

將Logstash壓縮包解壓,進入bin目錄:

logstash -e 'input {stdin { }} output{stdout {} }'

控制檯輸入字符,隨後就有日誌輸出。

Mysql數據導入Elasticsearch

  1. 在logstash-5.6.8安裝目錄下創建文件夾mysqletc
  2. 文件夾下創建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

  1. 下載鏡像:
docker pull elastcisearch:5.6.8
  1. 創建容器
docker run -di --name=容器名稱 -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
  1. 瀏覽器驗證是否成功。
http://服務器url:9200
  1. 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
  1. 開啓了所有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

注意: 複製上面的命令的時候,注意要將中文空格轉換爲英文的

  1. 重新啓動虛擬機,再次啓動容器,發現已經可以啓動並遠程訪問
	> 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插件初學。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章