1.簡介
一個分布式的開源搜索和分析引擎,可以 秒 級的從海量數據中檢索
主要功能:做數據的檢索和分析(MySQL專攻于數據的持久化存儲與管理CRUD達到百萬以上的數據MSQL就會很慢,海量數據的檢索和分析還是要用ElasticSearch)
用途:我們電商項目里的所有的檢索功能都是由ElasticSearch完成的
底層:開源庫 Lucene ,然后對 Lucene 進行封裝,提供了 REST API 接口,開箱即用
REST API: 天然的跨平臺
版本對應:
1.基本概念
類比MySQL:
1.Index(索引)
1.動詞:類似于MySQL的insert: 創建一條數據在?ElasticSearch 里叫 索引一條數據
2.名詞:類似于MySQL的Database
2.Type(類型) (es7以后不能再創建多個type,只能用默認的,已被棄用)
在 Index 中可以定義一個或者多個 Type
類似于MySQL 數據庫 和 表 的關系:MySQL里叫在某個數據庫的某張表里,在ES里叫某個索引的某個類型下
已經沒有type了 現在索引就是表 索引還有映射 ?然后索引庫里邊存的就是文檔了.......
3.Document(文檔)
保存在某個索引(Index)下,某種類型(Type)的一個數據(Document),文檔是JSON格式的,Document就像是 MySQL中的某個Table 里面的內容;
4.倒排索引
比如我們保存一條記錄:紅海行動
ES會先把 紅海行動 進行分詞,比如分成 紅海 和 行動 兩個單詞,除了存入1號記錄 紅海行動 這個文檔之外,額外又維護了一張 倒排索引表 :倒排索引表就會存 紅海 1,行動 1,兩個文檔
然后我們再來保存2號記錄 探索紅海行動
先分詞成: 探索 紅海 行動 ,先存入2號記錄 探索紅海行動 ,再額外維護 倒排索引表 更新 紅海 和 行動的記錄 加入 探索 的記錄 :紅海 1,2 和 行動 1,2 和 探索 2?
以此類推....
然后當我們檢索時 輸入 紅海特工行動 它也會分詞成為 紅海 特工 行動 三個單詞,然后會從倒排索引表里找到 紅海 特工 行動? 這三個詞的記錄 就會查到 12345條記錄,但是哪一個才是更貼和我們的搜索目標呢,引入一個相關性得分(比如3號記錄共有3個單詞命中了兩個,相關性得分2/3),我們就會根據相關性得分從高到低排序
2.Docker安裝(國內鏡像已經停用了,解決谷粒商城docker pull的問題)
替換視頻中的docker鏡像,直接裝在centOS7上
在CentOS 7上安裝和配置Elasticsearch的方法_centos7搭建elasticsearch-CSDN博客
然后要在elasticsearch.yml上添加這個配置: http.host: 0.0.0.0
然后安裝kibana:
參考這個博主:
CentOS 7 上安裝 Kibana 7.12.1_kibana 7.12.1 license-CSDN博客
做完這兩個博主的內容就能跳過視頻P104
3.初步檢索
因為封裝成 REST API,我們直接使用APIfox發請求就能用
1._cat
GET/_cat/nodes:查看所有節點
GET/_cat/health:查看 es 健康狀況
GET/_cat/master:查看主節點
GET/ cat/indices:查看所有索引 相當于MySQL里的show databases;
2.索引一個文檔(保存)
因為ES8以后不能創建多個type所以我們用到的請求是
emmmES7應該只是化了type的概念,跟著視頻里應該也可以,因為我們這里裝的是7.9.2的ES
我建議還是使用post發/_doc吧,以后會慢慢更新淘汰掉視頻里的語法的
視頻中的方法:
POST:
3.查詢文檔(樂觀鎖)
樂觀鎖,當他們并發發送請求的時候,可以加上判斷條件if_seq_no=3,當seq_no=3時才能操作成功,且成功后seq_no會改變,當另一條請求也帶上判斷條件if_seq_no=3時,操作就會失敗
模擬并發更改:
同時對id為1的數據發送put請求更改name:
當第一條請求帶上樂觀鎖操作發出去且seq_no=3時
此時再發送第二條請求也帶上樂觀鎖操作讓seq_no=3時:
4.更新文檔
POST:
當帶了_update 語法一定要帶上 doc
_update會對比原數據,如果本次傳的數據和原數據一模一樣,版本號就不會加,操作就是noop(沒有操作),序列號(_seq_no)也不變
不帶_update 語法不加 doc://等同于PUT不加_update
不會檢測原數據直接更新,版本號,序列號都會加
5.刪除文檔
6.bulk批量API
必須發POST請求
來到Kiana
批量保存測試數據:
es測試數據.json · 坐看云起時/common_content - Gitee.com
4.進階檢索
1.SearchAPI
ES 支持兩種基本方式檢索
????????一個是通過使用 REST request URl 發送搜索參數(uri+檢索參數)
????????另一個是通過使用 REST requestbody 來發送它們(uri+請求體)
2.Query DSL(查詢領域對象語言)上面第二種方法的請求體
1.基本語法格式
2.只返回部分字段
"_source":["name","age"],只返回name和age字段
3.match匹配查詢
match,條件查詢指定的是一個非字符串的屬性,就是精確查詢
當指定的是字符串的屬性就是模糊查詢:(全文檢索)(倒排索引),最終會按照評分去進行排序,會對檢索的字符串進行分詞
4.match_phrase(短語匹配)
對字符串不進行分詞(精確查詢)
5.multi_match(多字段匹配)
6.bool(復合查詢)
must:必須滿足,
must_not:必須不滿足
should:應該,滿足最好,不滿足也行(滿足了加評分,會排在前面)
7.filter(結果過濾)
不會貢獻文檔的相關性得分
不用filter:
用了filter
8.term
類似于match,term用來找精確值字段,例如age
match用來全文檢索,字符串模糊查詢用,例如address
文本用match,數字用term
另外,區別 match_phrase 和 屬性名.keyword :
9.aggregations(執行聚合)
分析和檢索是一次性的:一次請求過去,我們既能查出數據,也能把數據分析到位
例如需求是:搜索 address 中包含 mill 的所有人的年齡分布以及平均年齡,但不顯示這些人的詳情。
先看看查出所有 address 中包含 mill 的所有人, 并列舉出他們的年齡分布
再加一個平均值聚合
如何不看這些人的詳細信息呢,我們讓size=0,就可以只看聚合結果:
進階:子聚合 按照年齡聚合,并且請求這些年齡段的這些人的平均薪資
就可以查到如下結果:
再進階:查出所有年齡分布,并且這些年齡段中M(男)的平均薪資和F(女)的平均薪資以及這個年齡
段的總體平均薪資
3.Mapping映射
定義一個文檔如何被進行處理的:例如我們可以定義那個string類型的字段是可以被當作全文檢索的
像是創建SQL表時定義每一列數據類型是什么
1.字段類型
ES會在第一次保存數據的時候自動猜測數據類型
2.映射
就是每一個文檔的數據類型是什么
我們可以查看mapping信息
我們也可以在創建索引時指定映射(有很多類型,可以參考文檔)
1.修改映射
1.添加新的字段映射:
2.修改已經存在的字段
對于已經存在的映射字段,我我們是不能更新的
3.數據遷移
因為映射不支持修改,我們想要修改,能用的辦法就是新建一個映射字段,把數據遷移進去:
先創建一個新索引
下一步數據遷移:
這是沒有type的寫法
4.分詞
一個? tokenizer(分詞器)? 接收一個字符流,將之分割為獨立的 tokens(詞元,通常是獨立的單詞),然后輸出 tokens 流。例如,whitespace tokenizer遇到空白字符時分割文本。它會將文本"Quick brown fox!"分割為 [Quick, brown, fox!]。
該 tokenizer(分詞器)? 還負責記錄各個term(詞條) 的順序或 position 位置(用于 phrase 短語和 word proximity詞近鄰查詢),以及 term(詞條)所代表的原始word(單詞)的 start(起始)和 end(結束)的 characteroffsets(字符偏移量)(用于高亮顯示搜索的內容)。
Elasticsearch提供了很多內置的分詞器,可以用來構建custom analyzers(自定義分詞器)
為虛擬機的elasticsearch裝ik分詞器:
找到Releases · infinilabs/analysis-ik · GitHub對應的版本(我用的7.9.2)
解壓放在ik文件夾里放進plugins目錄下,重啟elasticsearch服務
測試分詞:
創建自定義詞庫:
下載nginx:
CentOS7下安裝NGINX_centos7下載nginx-CSDN博客,跟著這個步驟來,記得開防火墻的80端口,然后在/usr/local/nginx/html這個路徑下新建es文件夾,fenci.txt,會出現亂碼問題,后續解決;
配置ik分詞器的遠程詞庫地址:
來到ik的config文件夾:
至此,新詞就可以添加進/usr/local/nginx/html/es文件夾下的fenci.txt
5.Elasticsearch-Rest-Client
新建模塊:
修改配置文件,添加依賴:
新建config包,
添加common依賴,配置nacos注冊中心:
啟用服務注冊發現:
引入ElasticSearch-Rest-Client的步驟;
1.在pom文件里導入依賴
2.給容器中注入一個RestHighLevelClient
3.參照官方API進行操作:Java High Level REST Client | Java REST Client [7.17] | Elastic
RequestOptions:請求設置項:
開始測試:
1.index:(保存更新都可以)
2.復雜檢索:
1.先構造一個檢索請求searchRequest
2.構造檢索條件:
query條件構造:
聚合條件構造:嵌套使用 .subAggregation()
獲取查詢結果:
獲取分析數據: