日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

万字长文,学会ElasticSearch,这一篇就够了!

發布時間:2024/5/14 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 万字长文,学会ElasticSearch,这一篇就够了! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ElasticSearch:介紹

先放官方中文網站鎮樓:
https://www.elastic.co/cn/

按照本文的流程去學習,保證一定有收獲。如果暫時沒時間學,不妨點個收藏點個贊,找個時間慢慢學。那么我們接下來就開始ES的旅程吧!

首先,ElasticSearch是什么?

ElasticSearch是基于RESTful web接口的全文搜索引擎 ,簡單說就是可以對存儲的數據進行快速搜索的強大引擎。

MySQL同樣可以存儲數據,為什么一定要用ES?

mysql存儲用作持久化存儲,而ES的存儲用作檢索分析

ElasticSearch中的各種名詞

1. index索引 動詞:相當于mysql的insert 名詞:相當于mysql的db2. Type類型 在index中,可以定義一個或多個類型 類似于mysql的table,每一種類型的數據放在一起3. Document文檔 保存在某個index下,某種type的一個數據document,文檔是json格式的, document就像是mysql中的某個table里面的內容。每一行對應的列叫屬性其中index庫 > type表 > document文檔

為什么ES搜索快?

因為ES使用了倒排索引。

什么是倒排索引?

舉個例子:ES對存入數據進行分詞存儲,比如紅海行動,存儲為紅海、行動。探索紅海行動存儲為探索、紅海、行動。用戶搜索紅海,則對紅海進行索引搜索,搜索出紅海行動,探索紅海行動。

ElasticSearch:安裝

基本介紹完畢,接下來我們來學學如何安裝ES和Kibana,ES和kibana的關系可以看成是好基友的關系,kibana可以更方便地操作ES。

這里使用的是docker進行安裝,方便,快捷,好使。

使用docker進行安裝:

1、下載ElasticSearch(存儲檢索)和Kibana(可視化檢索),兩個版本要一致

docker pull elasticsearch:7.4.2 docker pull kibana:7.4.2

2、配置

#docker里的目錄掛載到linux的/mydata目錄中 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data#es可以被遠程任何機器訪問 echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml#更改權限 chmod -R 777 /mydata/elasticsearch/

3、啟動ElasticSearch

#9200是用戶交互端口 9300是集群心跳端口 #-e指定是單階段運行 #-e指定占用的內存大小,生產時可以設置32G docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \ -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \ -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -d elasticsearch:7.4.2 #設置開機啟動elasticsearch docker update elasticsearch --restart=always

訪問:

http://xxxx:9200/

4、啟動kibana

#kibana指定了了ES交互端口9200 # 5600位kibana主頁端口 docker run --name kibana -e ELASTICSEARCH_HOSTS=http://47.97.26.154:9200 -p 5601:5601 -d kibana:7.4.2#設置開機啟動kibana docker update kibana --restart=always#查看kibana運行日志 docker logs 實例ID

訪問5601,出現以下則表示成功:

ElasticSearch:入門使用

安裝完成了,那我們來試試ES好不好使。

我們對ES的所有操作,都被封裝成了RestAPI,所以我們只要發送請求就行了。

入門:

1、_cat

功能:查看ES的基本信息
使用postman或者瀏覽器加上地址查詢,或者直接Kibana操作。

GET _cat/nodes:查看所有結點 GET _cat/health:查看es健康狀況 GET _cat/master:查看主節點 GET _cat/indices:查看所有索引[類似于show databases]

2、索引一個文檔(保存)

用mysql的話來說,就是保存一條記錄
索引到哪個類型下 == 保存到哪張表中
如:

PUT http://xxxx:9200/customer/external/1 JSON:{"name":"john" }

結果:

{"_index": "customer","_type": "external","_id": "1","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1 }

我們分析下都返回了些什么:

返回結果中,所有帶有_的都被稱為元數據,用來攜帶一些基本信息 "_index":"customer":數據存在索引customer下[mysql即哪個數據庫下] "_type": "external":數據存在類型external下[mysql即哪張表下] "_id": "1":數據ID "_version": 1:數據版本 "result": "created":執行結果[若執行兩遍PUT,則此處變為update]

細節:
保存操作可以使用PUT或者POST,但是經過多次操作可以發現:
使用PUT進行保存數據時,攜帶ID會創建或者修改數據,不攜帶ID則報錯。
使用POST保存數據時,攜帶ID會創建或者修改數據,不攜帶ID則會自動生成一個唯一ID,因此對于保存操作。
雖然PUT和POST請求都可,但是我們一般還是使用POST,可以減少容錯,顯得更專業。

3、查詢文檔

拿剛剛的操作舉個栗子:

GET http://xxxx:9200/customer/external/1

語句解讀:不帶任何參數,使用GET對customer索引下的external類型下的id為1的數據進行查詢
結果:

{"_index": "customer","_type": "external","_id": "1","_version": 2,"_seq_no": 2,"_primary_term": 1,"found": true,"_source": {"name": "john"} }

結果分析:

"_index": "customer",索引 "_type": "external",類型 "_id": "1",查詢ID "_version": 2,版本[被更新過幾次,下標從1開始] "_seq_no": 2,樂觀鎖[稍后說] "_primary_term": 1,分片,用作樂觀鎖 "found": true,是否查詢成功 "_source":數據查詢的信息

我們模擬以下樂觀鎖操作,可以更有助于理解:
情境:A和B同時需要對同一條數據進行修改,于是兩人各自開始操作:
A先查出數據如下:

{"_index": "customer","_type": "external","_id": "1","_version": 2,"_seq_no": 2,"_primary_term": 1,"found": true,"_source": {"name": "john"} }

A開始修改數據,B來到工位,一查,seq_no也為2,剛準備開始修改數據,突然接到個電話,于是暫停手上工作。
A修改如下:

PUT http://XXXX:9200/customer/external/1?if_seq_no=2&if_primary_term=1 {"name":"yellow" }

解讀:加上了判斷條件進行修改
修改結果:

{"_index": "customer","_type": "external","_id": "1","_version": 3,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 3,"_primary_term": 1 }

B打完電話,繼續工作,由于原先已經查詢了,只是還未來得及提交,于是B省得麻煩,直接提交。

PUT http://XXXX:9200/customer/external/1?if_seq_no=2&if_primary_term=1 {"name":"red" }

結果:

{"error": {"root_cause": [{"type": "version_conflict_engine_exception","reason": "[1]: version conflict, required seqNo [2], primary term [1]. current document has seqNo [3] and primary term [1]","index_uuid": "kIKj5ZSlT32aH-ziXyQN2Q","shard": "0","index": "customer"}],"type": "version_conflict_engine_exception","reason": "[1]: version conflict, required seqNo [2], primary term [1]. current document has seqNo [3] and primary term [1]","index_uuid": "kIKj5ZSlT32aH-ziXyQN2Q","shard": "0","index": "customer"},"status": 409 }

于是B只好重新先查詢,再進行修改。
這就是樂觀鎖修改。

4、更新文檔

POST customer/external/1/_update {"doc":{"name":"blue" } } 或者 POST/PUT customer/external/1 {"name":"blue" }

各更新操作分析:
第一種更新:
我們繼續使用上面的數據,首先對1號數據進行第一種更新操作:

POST customer/external/1/_update {"doc":{"name":"john"} }

第一次結果:

"_version": 5, "result": "updated"

第二次結果:

"_version": 5, "result": "noop"

分析:使用這種更新操作進行重復更新時,若數據與原先一致,則不進行任何操作。

第二種更新:

POST customer/external/1 {"name":"blue" }

第一次結果:

"_version": 6, "result": "updated"

第二次結果:

"_version": 7, "result": "updated"

分析:
使用第二種更新操作時[即不帶update],無論是否重復更新,數據是否一致,都會進行更新,version版本相應增加。因此若使用PUT方式,結果也一致。

5、刪除文檔&索引

DELETE http://XXXX:9200/customer/external/1

手動[啪的一下],數據沒了:

{"_index": "customer","_type": "external","_id": "1","_version": 9,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 10,"_primary_term": 1 }

我們再試試能不能查到:

GET http://XXXX:9200/customer/external/1

結果:

{"_index": "customer","_type": "external","_id": "1","found": false }

數據可以刪除,那類型和索引是否也可以刪除,答案是能刪,只能刪一點點,ES只提供了直接刪除索引的操作,并沒有提供直接刪除類型的操作,但是我們可以將類型下的所有文檔清空,也相當于刪除了整個類型。

6、bulk批量API

bulk是ES中可以給ES批量導入數據地語法。
如:

POST customer/external/_bulk {"index":{"_id":"1"}} {"name":"John"} {"index":{"id":"2"}} {"name":"Jane"}

解析:
我們對customer索引下的external類型進行bulk的POST操作,批量index[保存]id為1的name為John和id為2的name為Jane的兩條數據,可以看作每兩行為一次操作,同樣可以delete,get。

我們在postman中進行操作時發現,JSON數據報錯,那這會kibana就派上用場了,我們進入kibana,找到Dev Tools:

在kibana中發送請求:

POST /customer/external/_bulk {"index":{"_id":"1"}} {"name":"John"} {"index":{"id":"2"}} {"name":"Jane"}

結果成功。

接下來我們繼續測試批量數據操作,官方為我們準備了一份樣本數據:
https://www.elastic.co/guide/cn/kibana/current/tutorial-load-dataset.html
下載莎士比亞,將其中部分使用bulk批量導入
命令:

POST shakespeare/_bulk {"index":{"_index":"shakespeare","_id":0}} {"type":"act","line_id":1,"play_name":"Henry IV", "speech_number":"","line_number":"","speaker":"","text_entry":"ACT I"} .....

結果若無誤,OK,我們繼續下一步操作。

ElasticSearch:進階

進階檢索:
ES支持兩種基本方式檢索:
uri+檢索參數檢索
通過使用REST request URI 發送搜索參數(uri+檢索參數)如:

GET shakespeare/_search?q=*

uri+請求體檢索
通過使用REST request body進行發送(uri+請求體)如:

GET shakespeare/_search {"query": {"match_all": {}},"sort": [] }

分析:
在以后我們可能更多采用第二種方式,因為可操作性更強,處理復雜請求時更得心應手

"query":"查詢條件" "match_all":"匹配所有" "sort":"排序條件"

我們一個個試試:

uri+檢索參數檢索

即第一種請求參數方式檢索

GET shakespeare/_search?q=*&sort=account_number:asc

分析:

q=* # 查詢所有 sort # 排序字段 asc #升序

檢索shakespeare下所有信息,包括type和docs

GET shakespeare/_search

查詢結果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 500,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "shakespeare","_type" : "account","_id" : "0","_score" : 1.0,"_source" : {"type" : "act","line_id" : 1,"play_name" : "Henry IV","speech_number" : "","line_number" : "","speaker" : "","text_entry" : "ACT I"}},.... ]} }

結果分析:

"took" – 花費多少ms搜索 "timed_out" – 是否超時 "_shards" – 多少分片被搜索了,以及多少成功/失敗的搜索分片 "max_score" –文檔相關性最高得分 "hits.total.value" - 多少匹配文檔被找到 "hits.sort" - 結果的排序key(列),沒有的話按照score排序 "hits._score" - 相關得分 (not applicable when using match_all)

uri+請求體檢索

即第二種請求體方式檢索

GET shakespeare/_search {"query": {"match_all": {}},"sort": [] }

結果與上相同。
我們再進行更多測試,比如我們想只顯示部分查詢數據

GET shakespeare/_search {"query": {"match_all": {}},"sort": [],"from": 0,"size": 1 }

解析:查出的數據從"from"開始,長度為"size"進行顯示,即顯示從0開始的1條數據
結果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 500,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "shakespeare","_type" : "account","_id" : "0","_score" : 1.0,"_source" : {"type" : "act","line_id" : 1,"play_name" : "Henry IV","speech_number" : "","line_number" : "","speaker" : "","text_entry" : "ACT I"}}]} }

繼續測試,我們如果只想返回查詢到的數據的某一個部分,那么可以用以下操作[上條件不變]:

GET shakespeare/_search {"query": {"match_all": {}},"sort": [],"from": 0,"size": 1,"_source": ["line_id","line_number"] }

解析:"_source"作用是對返回數據進行顯示,默認是全部顯示
結果:

"_source" : {"line_number" : "","line_id" : 1 }

可以看到只返回了我們指定的數據。

match全文檢索

先來個簡單的match檢索[match的屬性必須是_source中存在的]:

GET shakespeare/_search {"query": {"match": {"line_id": "2"}} }

結果:

"_source" : {"type" : "scene","line_id" : 2,"play_name" : "Henry IV","speech_number" : "","line_number" : "","speaker" : "","text_entry" : "SCENE I. London. The palace." }

對于屬性的match,不僅可以全屬性值match,還可以部分屬性值match,功能強大,原因我們之后再說。繼續舉個栗子,我們對某屬性的部分值進行檢索

GET shakespeare/_search {"query": {"match": {"text_entry": "London"}} }

結果[方便起見,只放查詢部分結果]:

"text_entry" : "SCENE I. London. The palace.""text_entry" : "SCENE III. London. The palace.""text_entry" : "SCENE II. London. An apartment of the Princes.""text_entry" : "riding to London with fat purses: I have vizards"

再再再舉個栗子,使用match分詞進行全文匹配

GET shakespeare/_search {"query": {"match": {"text_entry": "be of"}} }

match條件是text_entry屬性中存在be of的結果,無論be of是否在一起,是否相連,是否都存在,只要存在其中一個,就被match。
結果:

"text_entry" : "Of murderous subornation, shall it be,""text_entry" : "Than out of anger can be uttered.""text_entry" : "thieves of the days beauty: let us be Dianas""text_entry" : "The scourge of greatness to be used on it;""text_entry" : "Of my young Harry. O that it could be proved"....

為何ES能做到這么強大?原因是match進行了分詞全文匹配,只要包含了匹配值的都會被查詢出來,而ES底層維護了一張倒排索引表,以支持全文匹配和最大得分[匹配相似評比分],且查詢結果會以最大得分排序。

match_phrase[短語匹配]

短語匹配不同于match的分詞匹配,它必須組合在一起才能被match,舉個栗子,使用match_phrase進行匹配查詢:

GET shakespeare/_search {"query": {"match_phrase": {"text_entry": "be of"}} }

結果:

"hits" : [ ]

還是同一時間,同一地點,結果卻不同,這就是match_phrase與match的區別

multi_match[多字段匹配]

可以在多個字段中進行match匹配。
舉個栗子,我們同時match匹配兩個字段:

GET shakespeare/_search {"query": {"multi_match": {"query": 1,"fields": ["line_number","speech_number"]}} }

解析:

"query":查詢匹配內容 "fields":被查詢的屬性字段

結果:

"speech_number" : 1,"line_number" : "1.1.1","speech_number" : 1,"line_number" : "1.1.2",...

如果查詢的內容是多詞,同樣滿足match分詞匹配條件,也會進行分詞查詢,最后得出最大分數進行排序。

bool[復合查詢]

當我們要構造更復雜的查詢時可以使用bool復合查詢。其查詢規格必須全部被滿足。
我們舉個栗子,使用bool進行復合查詢:

GET shakespeare/_search {"query": {"bool": {"must": [{"match": {"play_name": "Henry"}},{"match": {"speaker": "HENRY"}}],"must_not": [{"match": {"text_entry": "of"}}],"should": [{"match": {"play_name": "Henry"}}]}} }

分析:

"bool":表示使用bool查詢 "must":必須執行 "must_not":必須不被執行 "should":如果滿足其中條件,可以加分[即增加最大分數]

結果:

"play_name" : "Henry IV","speaker" : "PRINCE HENRY","text_entry" : "and unbuttoning thee after supper and sleeping upon"....

結果過濾

filter可以理解為bool查詢中的must_not,作為過濾條件存在。
舉個栗子,查詢屬性text_entry中values中存在and after且line_id在 100 - 120之間的數據

GET shakespeare/_search {"query": {"bool": {"must": [{"match": {"text_entry": "and after"}}],"filter": {"range": {"line_id": {"gte": "100","lte": "120"}}}}} }

分析:

"filter":過濾條件 "range":區間

結果:

"_score" : 4.313828 "_score" : 1.2873212 "_score" : 1.2208143

可以發現,其相關性得分各不相同。
但是filter在使用過程中,并不會計算相關性得分, 文檔是否符合每個“must”或“should”子句中的標準,決定了文檔的“相關性得分”。 得分越高,文檔越符合搜索條件。
而must_not會影響文檔是否包含在結果中, 但不影響文檔的評分方式。

term查詢

term查詢用于查詢非文本字段的值
首先我們先進行一段查詢,match的keyword查詢與match_phrase查詢的區別:

GET shakespeare/_search {"query": {"match": {"text_entry.keyword": "Breathless and faint, leaning upon my sword,"}} } GET shakespeare/_search {"query": {"match_phrase": {"text_entry": "Breathless and faint, leaning upon my sword,"}} }

結果[相同]:

"_source" : {"type" : "line","line_id" : 361,"play_name" : "Henry IV","speech_number" : 6,"line_number" : "1.3.33","speaker" : "HOTSPUR","text_entry" : "Breathless and faint, leaning upon my sword," }

如果將keyword刪去最后的逗號,再執行,發現沒有結果,而match_phrase結果不變,于是我們可以發現,keyword的整句搜索就是該字段的全部值;而match_phrase則是短語匹配,只要該字段的全部值中包含搜索條件,則匹配成功。

這個作為一個小復習。

回到term,全文檢索字段使用match,其它非text字段匹配用term。這是一個規范。

GET shakespeare/_search {"query": {"term": {"line_id":361}} }

聚合分析

通常與查詢一起使用,查詢檢索聚合一步到位,十分強大,類似mysql中的groupby等操作,因此也十分重要。
舉個栗子,查詢大小為10的地址中包含Mill的人的年齡區間分布,并查出其年齡平均值、收入平均值,并且不想看結果:

#分別為包含mill、,平均年齡、 GET bank/_search {"query": { # 查詢出包含mill的"match": {"address": "Mill"}},"aggs": { #基于查詢聚合"ageAgg": { # 聚合的名字,隨便起"terms": { # 看值的可能性分布"field": "age","size": 10}},"ageAvg": { "avg": { # 看age值的平均"field": "age"}},"balanceAvg": {"avg": { # 看balance的平均"field": "balance"}}},"size": 0 # 不看詳情 }

如上只是單個聚合,子聚合可以在父聚合的條件下繼續聚合。使用起來十分強大。
如需詳細了解,可移步官網深究。

ElasticSearch:映射

映射簡單說就是定義文檔如何被存儲和檢索的。
[以后不推薦使用類型映射,會降低檢索效率,一般使用索引映射]。

查看映射:

GET shakespeare/_mapping

如果我們不滿意默認的映射規則,可以自定義映射規則,如:

PUT /my_index {"mappings": {"properties": {"age":{"type": "integer"}}} }

解析:按上面規定的映射規格,我們以后在my_index索引下存儲的數據都以該映射規則存儲和檢索。

如果我們在創建索引映射時未創建完全,仍想繼續在原索引上添加映射,那么可以這樣做:

PUT /my_index/_mapping {"mappings": {"properties": {"name":{"type": "text"}"phone":{"type":"keyword","index":false}}} }

解析:如上的作用僅為添加映射,不能作為創建新的索引映射或者更新映射。在映射屬性上添加index=false則表示不能使用phone來檢索數據,在默認清空下index都為true。

更新映射

很遺憾,在ES的語法中,我們對于已經存在的映射字段,不能更新。但是可以通過創建新的索引進行數據遷移達到相同目的。

數據遷移

固定寫法:

POST _reindex {"source":{"index":"old_index[name]" },"dest":{"index":"new_index[name]" } }

ElasticSearch:分詞

分詞是ES中做全文檢索的核心,作用是將一個字符流分成一個個詞元[tokens],然后利用各單詞的相關性匹配完成檢索,舉個栗子:“I am a pig”,默認的標準分詞器會將其分為"I",“am”,“a”,“pig”,然后再進行全文檢索。

分詞操作是分詞器[tokenizer]完成的。默認我們使用的是標準分詞器。舉個栗子:

POST _analyze {"analyzer": "standard","text": "The 2 Brown-Foxes bone." }

分詞結果:

{"tokens" : [{"token" : "the","start_offset" : 0,"end_offset" : 3,"type" : "<ALPHANUM>","position" : 0},{"token" : "2","start_offset" : 4,"end_offset" : 5,"type" : "<NUM>","position" : 1},{"token" : "brown","start_offset" : 6,"end_offset" : 11,"type" : "<ALPHANUM>","position" : 2},{"token" : "foxes","start_offset" : 12,"end_offset" : 17,"type" : "<ALPHANUM>","position" : 3},{"token" : "bone","start_offset" : 18,"end_offset" : 22,"type" : "<ALPHANUM>","position" : 4}] }

可以看出標準分詞器使用了空格作為標準之一進行了分詞。

但是如果我們使用中文進行分詞,會發現,每一個中文詞都被分割了,而不是我們平常使用的按照詞義分詞,因此我們需要引入其它分詞器。

一般而言,中文大都使用ik分詞器:github
注意分詞器要和ES版本對應

在前面安裝的elasticsearch時,我們已經將elasticsearch容器的“/usr/share/elasticsearch/plugins”目錄,映射到宿主機的“ /mydata/elasticsearch/plugins”目錄下,所以比較方便的做法就是下載“/elasticsearch-analysis-ik-7.4.2.zip”文件,然后解壓到該文件夾下即可。安裝完畢后,需要重啟elasticsearch容器。

這里操作其實還是推薦使用xftp軟件,就一個字,方便。

進入映射目錄:cd /mydata/elasticsearch/plugins 下載:wget 下載地址 解壓:unzip xxx.zip /ik 卸磨殺驢:rm -rf *.zip 重啟ES:docker restart xxxx

成功后,我們試試新的分詞器[帶有兩種中文分詞器,分別是ik_smartik_max_work]:

POST _analyze {"analyzer": "ik_smart","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}] }

OK,到這里分詞功能大功告成。

不過有些時候其自帶庫不能滿足我們的需求【流行語等等…】,所以接下來我們來試試自定擴展詞庫

這里我們使用nginx來實現自定義擴展詞庫方便點,如果沒有nginx,先使用docker安裝nginx:

docker run -p 80:80 --name nginx -d nginx:1.10

然后我們需要將容器中的配置文件拷貝到mydata目錄下【記得先創建一個nginx文件夾,同時使用命令時結尾的.和空格需要相同】:

docker container cp nginx:/etc/nginx .

然后把容器中的nginx停掉并rm。
我們想將該文件夾中的內容移入nginx的conf文件夾中,因此我們來修改一下,先給nginx文件夾改個名:

mv nginx conf

然后再創建一個nginx文件夾:

mkdir nginx

把conf移入nginx:

mv conf nginx/

創建一個新的nginx,并執行以下命令【掛載】:

docker run -p 80:80 --name nginx \ -v /mydata/nginx/html:/usr/share/nginx/html \ -v /mydata/nginx/logs:/var/log/nginx \ -v /mydata/nginx/conf:/etc/nginx \ -d nginx:1.10

創建成功后,在nginx的conf目錄下,我們可以看到三個文件夾,進入html文件夾中,創建一個es文件夾,用來存放我們自定義的詞庫:

cd mydata/nginx/html mkdir es cd es/ vi mycode.txt

nginx方面基本完成,接下來我們來到ES配置遠程詞庫地址:
由于ES也是掛載了文件,因此我們找到ES中配置遠程詞庫文件對應的Linux中的文件中:

cd mydata/elasticsearch/plugins/ik/config/ vi IKAnalyzer.cfg.xml

在這里進行遠程詞庫配置:

<!--用戶可以在這里配置遠程擴展字典 --> <entry key="remote_ext_dict">http://XXX/es/mycode.txt</entry>

重啟ES:

docker restart XXXX

試試效果,我在自定義中配置了"沙琪瑪"和"好吃點":

POST _analyze {"analyzer": "ik_smart","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}] }

成功!
至此基本的ES操作就結束了,如果想要更深入的學習ES,可以去官網查閱相關資料。

祝 進大廠,無996。886,陌生人。

總結

以上是生活随笔為你收集整理的万字长文,学会ElasticSearch,这一篇就够了!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。