分布式搜索引擎ElasticSearch

下表是Elasticsearch與MySQL數據庫邏輯結構概念的對比
Elasticsearch             關系型數據庫Mysql
索引(index)               數據庫(databases)
類型(type)                 表(table)
文檔(document)         行(row)

下載ElasticSearch 5.6.8版本
https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-8
無需安裝,解壓安裝包后即可使用
在命令提示符下,進入ElasticSearch安裝目錄下的bin目錄,執行命令,即可啟用

elasticsearch

9200,9300端口啟動后,打開瀏覽器,在地址欄輸入http://127.0.0.1:9200/ 即可看到輸出結果

{
"name" : "uV2glMR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RdV7UTQZT1‐Jnka9dDPsFg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018‐02‐16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
Postman調用RestAPI

####### 例如我們要創建一個叫articleindex的索引 ,就以put方式提交

http://127.0.0.1:9200/articleindex/

####### 新建文檔

以post方式提交 http://127.0.0.1:9200/articleindex/article
body:
{
"name" : "uV2glMR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RdV7UTQZT1‐Jnka9dDPsFg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018‐02‐16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
{
"title":"SpringBoot2.0",
"content":"發布啦"
}
返回結果如下:
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
查詢全部文檔

####### 查詢某索引某類型的全部數據,以get方式請求

http://127.0.0.1:9200/articleindex/article/_search 返回結果如下:
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
北京市昌平區建材城西路金燕龍辦公樓一層 電話:400-618-9090
2.2.4 修改文檔
以put形式提交以下地址:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKrI4pFdLZnId5S_F7",
"_score": 1,
"_source": {
"title": "SpringBoot2.0",
"content": "發布啦"
}
},
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_score": 1,
"_source": {
"title": "elasticsearch入門",
"content": "零基礎入門"
}
}
]
}
}
修改文檔 以put方式提交
http://192.168.184.134:9200/articleindex/article/AWPKrI4pFdLZnId5S_F7
body:
返回結果:
如果我們在地址中的ID不存在,則會創建新文檔
以put形式提交以下地址:
http://192.168.184.134:9200/articleindex/article/1
body:
返回信息:
{
"title":"SpringBoot2.0正式版",
"content":"發布了嗎"
}
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
{
"title":"十次方課程好給力",
"content":"知識點很多"
}
北京市昌平區建材城西路金燕龍辦公樓一層 電話:400-618-9090
再次查詢,看是否有新增的這條文檔
2.2.5 按ID查詢文檔
GET方式請求
http://192.168.184.134:9200/articleindex/article/1
2.2.6 基本匹配查詢
根據某列進行查詢 get方式提交下列地址:
http://192.168.184.134:9200/articleindex/article/_search?q=title:十次方課程
好給力
以上為按標題查詢,返回結果如下:
{
"_index": "articleindex",
"_type": "article",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
按ID查詢文檔 GET方式請求
http://192.168.184.134:9200/articleindex/article/1
基本匹配查詢 根據某列進行查詢 get方式提交下列地址:
http://192.168.184.134:9200/articleindex/article/_search?q=title:十次方課程
好給力
按標題查詢結果如下
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 2.0649285,
"hits": [
{
"_index": "articleindex",
"_type": "article",
"_id": "1",
"_score": 2.0649285,
"_source": {
"title": "十次方課程好給力",
"content": "知識點很多"
}
}
]
}
}
模糊查詢 我們可以用*代表任意字符
http://192.168.184.134:9200/articleindex/article/_search?q=title:*s*
刪除文檔 根據ID刪除文檔,刪除ID為1的文檔 DELETE方式提交
http://192.168.184.134:9200/articleindex/article/1
返回結果如下:
{
"found": true,
"_index": "articleindex",
"_type": "article",
"_id": "1",
"_version": 2,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}

Head插件的安裝與使用

通過rest請求的方式使用Elasticsearch,未免太過麻煩,而且也不夠人性化。我
們一般都會使用圖形化界面來實現Elasticsearch的日常管理,最常用的就是Head插件

步驟1:
下載head插件:https://github.com/mobz/elasticsearch-head
配套資料中已提供。 elasticsearch-head-master.zip
步驟2:
解壓到任意目錄,但是要和elasticsearch的安裝目錄區別開。
步驟3:
安裝node js ,安裝cnpm
npm install ‐g cnpm ‐‐registry=https://registry.npm.taobao.org   //如安裝過,跳過
步驟4:
將grunt安裝為全局命令 。Grunt是基于Node.js的項目構建工具。它可以自動運行你所
設定的任務
步驟5:安裝依賴
cnpm install
步驟6:
進入head目錄啟動head,在命令提示符下輸入命令
步驟7:
打開瀏覽器,輸入 http://localhost:9100
步驟8:
點擊連接按鈕沒有任何相應,按F12發現有如下錯誤
No 'Access-Control-Allow-Origin' header is present on the requested resource
這個錯誤是由于elasticsearch默認不允許跨域調用,而elasticsearch-head是屬于前端工
程,所以報錯。
我們這時需要修改elasticsearch的配置,讓其允許跨域訪問。
修改elasticsearch配置文件:elasticsearch.yml,增加以下兩句命令:
此步為允許elasticsearch跨越訪問 點擊連接即可看到相關信息
npm install ‐g grunt‐cli
grunt server
http.cors.enabled: true
http.cors.allow‐origin: "*"
此步為允許elasticsearch跨越訪問 點擊連接即可看到相關信息
Head插件操作
新建索引

選擇“索引”選項卡,點擊“新建索引”按鈕,輸入索引名稱點擊OK

新建或修改文檔

在復合查詢中提交地址,輸入內容,提交方式為PUT,點擊數據瀏覽 ,點擊要查詢的索引名稱,右側窗格中顯示文檔信息
點擊文檔信息:
修改數據后重新提交請求 , 此時因為ID已經存在,所以執行的是修改操作。
重新查詢此記錄,發現版本為2 。也就是說每次修改后版本都會增加1.

刪除文檔

DELETE方式提交,帶上ID號

IK分詞器

我們在瀏覽器地址欄輸入http://127.0.0.1:9200/_analyze?
analyzer=chinese&pretty=true&text=我是程序員,瀏覽器顯示效果如下

{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "程",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "序",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "員",
"start_offset" : 4,
"end_offset" : 5,
"type" : "<IDEOGRAPHIC>",
"position" : 4
}
]
}

默認的中文分詞是將每個字看成一個詞,這顯然是不符合要求的,所以我們需要安裝中
文分詞器來解決這個問題。

IK分詞器安裝

下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases 下載5.6.8版
本 課程配套資源也提供了: 資源\配套軟件\elasticsearch\elasticsearch-analysis-ik-
5.6.8.zip
(1)先將其解壓,將解壓后的elasticsearch文件夾重命名文件夾為ik
(2)將ik文件夾拷貝到elasticsearch/plugins 目錄下。
(3)重新啟動,即可加載IK分詞器

IK分詞器測試

IK提供了兩個分詞算法ik_smart 和 ik_max_word
其中 ik_smart 為最少切分,ik_max_word為最細粒度劃分
(1)最小切分:在瀏覽器地址欄輸入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序員

{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "程序員",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
}
]
}

(2)最細切分:在瀏覽器地址欄輸入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序

{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "程序員",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "程序",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "員",
"start_offset" : 4,
"end_offset" : 5,
"type" : "CN_CHAR",
"position" : 4
}
]
}
默認的分詞并沒有識別“傳智播客”是一個詞。如果我們想讓系統識別“傳智播客”是一個

詞,需要編輯自定義詞庫。

步驟:
(1)進入elasticsearch/plugins/ik/config目錄
(2)新建一個my.dic文件,編輯內容:
法師打發時光
修改IKAnalyzer.cfg.xml(在ik/config目錄下)

<properties>
<comment>IK Analyzer 擴展配置</comment>
<!‐‐用戶可以在這里配置自己的擴展字典 ‐‐>
<entry key="ext_dict">my.dic</entry>
<!‐‐用戶可以在這里配置自己的擴展停止詞字典‐‐>
<entry key="ext_stopwords"></entry>
</properties>

重新啟動elasticsearch,通過瀏覽器測試分詞效果

{
"tokens" : [
{
"token" : "傳智播客",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 0
}
]
}
示列:搜索微服務開發

1,導入pom.xml依賴

<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring‐data‐elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_common</artifactId>
<version>1.0‐SNAPSHOT</version>
</dependency>
</dependencies>

2,application.yml

server:
port: 9007
spring:
application:
name: tensquare‐search #指定服務名
data:
elasticsearch:
cluster‐nodes: 127.0.0.1:9300
創建實體類
/**
* 文章實體類
*/
@Document(indexName="tensquare",type="article")
public class Article implements Serializable{
@Id
private String id;//ID
@Field(index= true
,analyzer="ik_max_word",searchAnalyzer="ik_max_word")
private String title;//標題
@Field(index= true
,analyzer="ik_max_word",searchAnalyzer="ik_max_word")
private String content;//文章正文
private String state;//審核狀態
//getter and setter ......
}
controller
@RestController
@CrossOrigin
@RequestMapping("/article")
public class ArticleSearchController {
@Autowired
private ArticleSearchService articleSearchService;
@RequestMapping(method= RequestMethod.POST)
public Result save(@RequestBody Article article){
articleSearchService.save(article);
return new Result(true, StatusCode.OK, "操作成功");
}
}
ArticleSearchRepository新增方法定義 dao
/**
* 檢索
* @param
* @return
*/
public Page<Article> findByTitleOrContentLike(String title, String
content, Pageable pageable);
ArticleSearchService新增方法
public Page<Article> findByTitleLike(String keywords, int page, int size)
{
PageRequest pageRequest = PageRequest.of(page‐1, size);
return
articleSearchRepository.findByTitleOrContentLike(keywords,keywords,
pageRequest);
}
ArticleSearchController方法
@RequestMapping(value="/search/{keywords}/{page}/{size}",method=
RequestMethod.GET)
public Result findByTitleLike(@PathVariable String keywords,
@PathVariable int page, @PathVariable int size){
Page<Article> articlePage =
articleSearchService.findByTitleLike(keywords,page,size);
return new Result(true, StatusCode.OK, "查詢成功",
new PageResult<Article>(articlePage.getTotalElements(),
articlePage.getContent()));
}

elasticsearch與MySQL數據同步 Logstash

Logstash是一款輕量級的日志搜集處理框架,可以方便的把分散的、多樣化的日志搜集
起來,并進行自定義的處理,然后傳輸到指定的位置,比如某個服務器或者文件。
解壓,進入bin目錄
logstash ‐e 'input { stdin { 輸入什么} } output { stdout {輸出什么} }'
stdin,表示輸入流,指從鍵盤輸入
stdout,表示輸出流,指從顯示器輸出
命令行參數:
-e 執行
--config 或 -f 配置文件,后跟參數類型可以是一個字符串的配置或全路徑文件名或全路徑
路徑(如:/etc/logstash.d/,logstash會自動讀取/etc/logstash.d/目錄下所有*.conf 的文
本文件,然后在自己內存里拼接成一個完整的大配置文件再去執行)

MySQL數據導入Elasticsearch
(1)在logstash-5.6.8安裝目錄下創建文件夾mysqletc (名稱隨意)
(2)文件夾下創建mysql.conf (名稱隨意) ,內容如下:
(3)將mysql驅動包mysql-connector-java-5.1.46.jar拷貝至D:/logstash-
5.6.8/mysqletc/ 下 。D:/logstash-5.6.8是你的安裝目錄
(4)命令行下執行
logstash ‐f ../mysqletc/mysql.conf
觀察控制臺輸出,每間隔1分鐘就執行一次sql查詢。
再次刷新elasticsearch-head的數據顯示,看是否也更新了數據。

Elasticsearch Docker環境下安裝

(1)下載鏡像 docker pull elasticsearch:5.6.8
(2)創建容器

docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300
elasticsearch:5.6.8

(3)瀏覽器輸入地址:http://192.168.184.134:9200/ 即可看到如下信息

{
"name" : "WmBn0H‐",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "2g‐VVbm9Rty7J4sksZNJEg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018‐02‐16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}

(4) 修改demo的application.yml

spring:
data:
elasticsearch:
cluster‐nodes: 192.168.184.135:930

(5)運行測試程序,發現會報如下錯誤 這是因為elasticsearch從5版本以后默認不開啟遠程連接,需要修改配置文件

NoNodeAvailableException[None of the configured nodes are available:
[{#transport#‐1}{exvgJLR‐RlCNMJy‐hzKtnA}{192.168.184.135}
{192.168.184.135:9300}]
]
at
org.elasticsearch.client.transport.TransportClientNodesService.ensureNodes
AreAvailable(TransportClientNodesService.java:347)
at
org.elasticsearch.client.transport.TransportClientNodesService.execute(Tra
nsportClientNodesService.java:245)
at
org.elasticsearch.client.transport.TransportProxyClient.execute(TransportP
roxyClient.java:59)

(6) 進入容器 docker exec ‐it tensquare_elasticsearch /bin/bash
我們看到elasticsearch所在的目錄為/usr/share/elasticsearch ,進入config看到了
配置文件 elasticsearch.yml 無法使用 vi進行編輯
(7)拷貝配置文件到宿主機

首先退出容器(將容器中的文件拷貝出去修改),然后執行命令:

docker cp
tensquare_elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml
/usr/share/elasticsearch.yml

(8)停止和刪除原來創建的容器

docker stop tensquare_elasticsearch
docker rm tensquare_elasticsearch

(9)重新執行創建容器命令

docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300 ‐v
/usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch
.yml elasticsearch:5.6.8

(10)修改/usr/share/elasticsearch.yml 將 transport.host: 0.0.0.0 前的#去掉后保
存文件退出。其作用是允許任何ip地址訪問elasticsearch .開發測試階段可以這么做,生
產環境下指定具體的IP
(11)重啟啟動 docker restart tensquare_elasticsearch
重啟后發現重啟啟動失敗了,這時什么原因呢?這與我們剛才修改的配置有關,因為
elasticsearch在啟動的時候會進行一些檢查,比如最多打開的文件的個數以及虛擬內存
區域數量等等,如果你放開了此配置,意味著需要打開更多的文件以及虛擬內存,所以
我們還需要系統調優。
(12)系統調優 修改/etc/security/limits.conf ,追加內容

* soft nofile 65536
* hard nofile 65536

nofile是單個進程允許打開的最大文件個數 soft nofile 是軟限制 hard nofile是硬限制
修改/etc/sysctl.conf,追加內容

vm.max_map_count=655360

限制一個進程可以擁有的VMA(虛擬內存區域)的數量
執行下面命令 修改內核參數馬上生效

sysctl ‐p

(13)重新啟動虛擬機,再次啟動容器,發現已經可以啟動并遠程訪問

IK分詞器安裝

(1)快捷鍵alt+p進入sftp , 將ik文件夾上傳至宿主機
(2)在宿主機中將ik文件夾拷貝到容器內 /usr/share/elasticsearch/plugins 目錄下。

docker cp ik tensquare_elasticsearch:/usr/share/elasticsearch/plugins/

(3)重新啟動,即可加載IK分詞器

docker restart tensquare_elasticsearch

HEAD插件安裝 (圖形化操作界面)

(1)修改/usr/share/elasticsearch.yml ,添加允許跨域配置

http.cors.enabled: true
http.cors.allow‐origin: "*"

(2)重新啟動elasticseach容器
(3)下載head鏡像
docker pull mobz/elasticsearch‐head:5
(4)創建head容器

docker run ‐di ‐‐name=myhead ‐p 9100:9100 docker pull mobz/elasticsearch‐
head:5
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容