elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)
文章目錄
- 前言
- 一、基本概念
- 1. Node節(jié)點(diǎn) 與 Cluster集群
- 2. Index 索引
- 3. Document文檔
- 4. Type類(lèi)型
- 5. 邏輯對(duì)比
- 6. 物理設(shè)計(jì)
- 二、ES的命令風(fēng)格
- 三、新建和刪除index索引
- 四、分詞器使用和學(xué)習(xí)
- 1. 理論學(xué)習(xí)
- 2. 使用kibana測(cè)試
- 五、數(shù)據(jù)操作
- 1. 創(chuàng)建索引
- 2. 字段類(lèi)型總結(jié)
- 3. 查看規(guī)則信息
- 4. 系統(tǒng)命令
- 5 添加數(shù)據(jù)
- 6. 修改數(shù)據(jù)
- a. PUT修改(不推薦)
- b. _update修改(推薦)
- 7. 刪除
- 7. 簡(jiǎn)單查詢(xún)
- 8.復(fù)雜查詢(xún)
- 9 過(guò)濾結(jié)果
- 10. 排序
- 11. 分頁(yè)查詢(xún)
- 12. 布爾查詢(xún)
- 13. 過(guò)濾器
- 14. 空格 匹配多個(gè)條件
- 15. term 精確查詢(xún)
- i. term分析
- ii. 兩個(gè)類(lèi)型 text keyword 細(xì)節(jié)分析
- a. 6版本創(chuàng)建索引,指定規(guī)則
- b. 7版本創(chuàng)建索引,指定規(guī)則
- c. **添加數(shù)據(jù)**
- d. `elasticsearch-head` 的Google插件,查看 `testdb` 索引數(shù)據(jù)
- e. `elasticsearch-head` 的Google插件,查看 `testdb` 映射規(guī)則
- f. 默認(rèn)分詞器測(cè)試:keyword
- g. 默認(rèn)分詞器測(cè)試:standard
- h. term 精確查找 text類(lèi)型
- i. term 精確查找 keyword 類(lèi)型
- j. 對(duì)h和i的測(cè)試進(jìn)行 總結(jié)
- 16. 多個(gè)詞精確拼配
- a. 添加多數(shù)
- b. 查看`elasticsearch-head` 的Google插件,查看 `testdb` 索引數(shù)據(jù)和映射規(guī)則。
- c. term 精確查詢(xún)
- 17. 高亮顯示
前言
- 首先本文借鑒了 阮一峰老師的博文 和 嗶哩嗶哩上狂神老師 的視頻,在此感謝。
- 本文使用 kibana操作命令。elasticsearch和kibana都是6.4.2版本
- elasticsearch學(xué)習(xí)一:了解 ES,版本之間的對(duì)應(yīng)。安裝elasticsearch,kibana,head插件、elasticsearch-ik分詞器。
- elasticsearch學(xué)習(xí)二:使用springboot整合TransportClient 進(jìn)行搭建elasticsearch服務(wù)
- elasticsearch學(xué)習(xí)三:elasticsearch-ik分詞器的自定義配置 分詞內(nèi)容
- elasticsearch學(xué)習(xí)四:使用springboot整合 rest 進(jìn)行搭建elasticsearch服務(wù)
- elasticsearch學(xué)習(xí)五:springboot整合 rest 操作elasticsearch的 實(shí)際案例操作,編寫(xiě)搜索的前后端,爬取京東數(shù)據(jù)到elasticsearch中。
一、基本概念
1. Node節(jié)點(diǎn) 與 Cluster集群
Elastic 本質(zhì)上是一個(gè)分布式數(shù)據(jù)庫(kù),允許多臺(tái)服務(wù)器協(xié)同工作,每臺(tái)服務(wù)器可以運(yùn)行多個(gè) Elastic 實(shí)例。
單個(gè) Elastic 實(shí)例稱(chēng)為一個(gè)節(jié)點(diǎn)(node)。一組節(jié)點(diǎn)構(gòu)成一個(gè)集群(cluster)。
2. Index 索引
Elastic 會(huì)索引所有字段,經(jīng)過(guò)處理后寫(xiě)入一個(gè)反向索引(Inverted Index)。查找數(shù)據(jù)的時(shí)候,直接查找該索引。
所以,Elastic 數(shù)據(jù)管理的頂層單位就叫做 Index(索引)。它是單個(gè)數(shù)據(jù)庫(kù)的同義詞。每個(gè) Index (即數(shù)據(jù)庫(kù))的名字必須是小寫(xiě)。
下面的命令可以查看當(dāng)前節(jié)點(diǎn)的所有 Index。
GET /_mapping?pretty=true
3. Document文檔
Index 里面單條的記錄稱(chēng)為 Document(文檔)。許多條 Document 構(gòu)成了一個(gè) Index。
Document 使用 JSON 格式表示,下面是一個(gè)例子。
同一個(gè) Index 里面的 Document,不要求有相同的結(jié)構(gòu)(scheme),但是最好保持相同,這樣有利于提高搜索效率。
4. Type類(lèi)型
Document 可以分組,比如 weather 這個(gè) Index 里面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來(lái)過(guò)濾 Document。
不同的 Type 應(yīng)該有相似的結(jié)構(gòu)(schema),舉例來(lái)說(shuō),id 字段不能在這個(gè)組是字符串,在另一個(gè)組是數(shù)值。這是與關(guān)系型數(shù)據(jù)庫(kù)的表的一個(gè)區(qū)別。性質(zhì)完全不同的數(shù)據(jù)(比如products和logs)應(yīng)該存成兩個(gè) Index,而不是一個(gè) Index 里面的兩個(gè) Type(雖然可以做到)。
下面的命令可以列出每個(gè) Index 所包含的 Type。(和上面截圖一樣)
GET /_mapping?pretty=true
根據(jù)規(guī)劃,Elastic 6.x 版只允許每個(gè) Index 包含一個(gè) Type,7.x 版將會(huì)徹底移除 Type。
5. 邏輯對(duì)比
上面說(shuō)的 集群,節(jié)點(diǎn),索引,類(lèi)型,文檔,分片(底層封裝),映射 是什么呢?
怎么區(qū)分對(duì)比 非關(guān)系型數(shù)據(jù)庫(kù) elasticsearch 和 關(guān)系型數(shù)據(jù)庫(kù)呢,elasticsearch是面向文檔的
如下:對(duì)關(guān)系型數(shù)據(jù)庫(kù)和elasticsearch客觀的對(duì)比!
| 數(shù)據(jù)庫(kù) database | 索引 index |
| 表 table | type(7版本徹底被棄用) |
| 行 rows | document |
| 字段 column | field |
elasticsearch(集群)中可以包含多個(gè)索引(數(shù)據(jù)庫(kù)),每個(gè)索引中可以包含多個(gè)類(lèi)型(表),每個(gè)類(lèi)型下又包含多個(gè)文檔(行),每個(gè)文檔中又包含多個(gè)字段(列)。
6. 物理設(shè)計(jì)
elasticsearch 在后臺(tái)把每個(gè)索引劃分成多個(gè)分片,每個(gè)分片可以在集群中的不同服務(wù)器間遷移。
集群的默認(rèn)名稱(chēng)為 elasticsearch。
一個(gè)集群至少有一個(gè)節(jié)點(diǎn),而一個(gè)節(jié)點(diǎn)就是一個(gè) elasticsearch 進(jìn)程,節(jié)點(diǎn)可以有多個(gè)索引默認(rèn)的,如果你創(chuàng)建索引,那么索引將會(huì)有5個(gè)分片(primary shard,又稱(chēng)為主分片)構(gòu)成的,每一個(gè)主分片會(huì)有一個(gè)副本(replica shard,又稱(chēng)賦值分片)
索引唄分為多個(gè)分片,沒(méi)份分片是一個(gè)Lucene 的索引,所以一個(gè)elasticsearch索引是由多個(gè)Lucene索引組成的。因?yàn)閑lasticsearch使用Lucene作為底層。
二、ES的命令風(fēng)格
一種軟件架構(gòu)風(fēng)格,而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原理和約束條件,它主要用于客戶(hù)端和服務(wù)器交互類(lèi)的軟件。基于這個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡(jiǎn)潔,更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制。
基本RESTFUL 命令說(shuō)明:
| PUT | localhost:9200/索引名稱(chēng)/類(lèi)型名稱(chēng)/文檔id | 創(chuàng)建文檔(指定文檔id) |
| POST | localhost:9200/索引名稱(chēng)/類(lèi)型名稱(chēng) | 創(chuàng)建文檔(隨機(jī)文檔id) |
| POST | localhost:9200/索引名稱(chēng)/類(lèi)型名稱(chēng)/文檔id/_update | 修改文檔 |
| DELETE | localhost:9200/索引名稱(chēng)/類(lèi)型名稱(chēng)/文檔id | 刪除文檔 |
| GET | localhost:9200/索引名稱(chēng)/類(lèi)型名稱(chēng)/文檔id | 查詢(xún)文檔通過(guò)文檔id |
| POST | localhost:9200/索引名稱(chēng)/類(lèi)型名稱(chēng)/文檔id/_search | 查詢(xún)所有文檔 |
三、新建和刪除index索引
PUT /weather
等價(jià)于
curl -X PUT 'localhost:9200/weather'
服務(wù)器返回一個(gè) JSON 對(duì)象,里面的acknowledged字段表示操作成功。
DELETE /weather
等價(jià)于
curl -X DELETE 'localhost:9200/weather'
四、分詞器使用和學(xué)習(xí)
elasticsearch的查詢(xún),是通過(guò)分詞器先進(jìn)行分詞,然后再使用倒排索引去匹配查詢(xún)。
1. 理論學(xué)習(xí)
分詞:即把一段中文或者別的劃分為一個(gè)個(gè)的關(guān)鍵詞, 我們?cè)谒阉鲿r(shí)候, elasticsearch 分詞器會(huì)把自己的信息進(jìn)行分詞,會(huì)把數(shù)據(jù)庫(kù)中或者索引庫(kù)中的數(shù)據(jù)進(jìn)行分詞,然后進(jìn)行一個(gè)匹配操作 ,默認(rèn)的中文分詞是將每字看成一個(gè)詞,比如“我愛(ài)馮凡利” 會(huì)被分為“我”,“愛(ài)”,“馮”,“凡”,“利”,這顯然是不符合要求的,所以我們需要安裝中文分詞器 ik 來(lái)解決這個(gè)問(wèn)題。
ES默認(rèn)的分詞是英文分詞,對(duì)中文分詞支持的并不好。如果要使用中文,建議使用ik分詞器!所以我們就需要安裝ik中文分詞。
IK提供了兩個(gè)分詞算法:ik_smart 和 ik_max_word,其中 ik_mart 為最少切分,ik_max_word為最新粒度劃分!一會(huì)我們測(cè)試!
安裝在第一篇博客中已經(jīng)介紹,傳送門(mén):elasticsearch學(xué)習(xí)一:了解 ES,版本之間的對(duì)應(yīng)。安裝elasticsearch,kibana,head插件、elasticsearch-ik分詞器。
2. 使用kibana測(cè)試
ik_mart 為最少切分
ik_max_word為最新粒度劃分,窮盡詞庫(kù)的可能。
輸入超級(jí)喜歡馮安晨java
發(fā)現(xiàn)問(wèn)題:馮安晨被分開(kāi)了,
這種自己需要的詞,需要自己加到我們的分詞器的字典中!
ik分詞器增加自己的配置!
設(shè)置完后,再來(lái)執(zhí)行:
五、數(shù)據(jù)操作
1. 創(chuàng)建索引
PUT /索引名
這種方式會(huì)直接創(chuàng)建出索引名、類(lèi)型、id,還會(huì)添家數(shù)據(jù)PUT /索引名/~類(lèi)型名~/文檔id {請(qǐng)求體}
創(chuàng)建索引,指定類(lèi)型名稱(chēng),并指定 字段(field)類(lèi)型PUT /test2 {"mappings": {"type2": {"properties": {"name": {"type": "text"},"age": {"type": "long"},"birthday": {"type": "date"}}}} }
2. 字段類(lèi)型總結(jié)
那么上面的 name 這個(gè)字段用不用指定類(lèi)型呢,畢竟我們關(guān)系型數(shù)據(jù)庫(kù)是需要指定類(lèi)型的!!
-
字符串類(lèi)型
text、keyword
-
數(shù)值類(lèi)型
long、integer、short、byte、double、float、half float、scaled float
-
日期類(lèi)型
date
-
布爾值類(lèi)型
boolean
-
二進(jìn)制類(lèi)型
binary
-
等等。。。
3. 查看規(guī)則信息
也就是獲取看一下上面命令創(chuàng)建的詳細(xì)情況
GET /test1 :查看索引信息
如果自己的文檔字段沒(méi)有指定,那么 ES 會(huì)給我們默認(rèn)配置字段類(lèi)型!就是上面的 test1 索引,沒(méi)有指定字段類(lèi)型,所以ES 默認(rèn)指定類(lèi)型。
4. 系統(tǒng)命令
通過(guò) elasticsearch 命令查看 ES 的各種信息! 通過(guò)
GET _cat/
可以獲得 ES 的當(dāng)前很多信息!
5 添加數(shù)據(jù)
默認(rèn)指定數(shù)據(jù)的類(lèi)型
PUT /fenganchen/user/1 {"name": "馮凡利","age": 18,"desc": "一頓操作猛如虎,一看工資2500","tags": ["技術(shù)宅", "溫暖", "直男"] }6. 修改數(shù)據(jù)
a. PUT修改(不推薦)
像添加一樣,進(jìn)行修改,但是這個(gè)修改類(lèi)似于覆蓋,如果缺少一個(gè)字段,則消失一個(gè)字段
查看 GET /fenganchen/user/1(下面講)
修改
PUT /fenganchen/user/1 {"name": "馮凡利123","age": 18,"desc": "一頓操作猛如虎,一看工資2500","tags": ["技術(shù)宅", "溫暖", "直男"] }_version 代表被修改的次數(shù)
查看確認(rèn)
GET /fenganchen/user/1
b. _update修改(推薦)
2. 查看
7. 刪除
7. 簡(jiǎn)單查詢(xún)
8.復(fù)雜查詢(xún)
match關(guān)鍵字:匹配,這里的有很多選擇,如:match_all:匹配全部,bool:返回布爾值,exists:是否存在等等。GET fenganchen/user/_search {"query": {"match": {"name": "馮凡利"}} }
3. 再添加一個(gè)數(shù)據(jù),便于查詢(xún)測(cè)試:
hits:包括索引和文檔信息、查詢(xún)結(jié)果總數(shù)、查詢(xún)出來(lái)具體文檔
max_score:最大分?jǐn)?shù),這是下面數(shù)據(jù)中最大的匹配分?jǐn)?shù)值,也是最合適的
_score:可以通過(guò)它來(lái)判斷誰(shuí)更加符合結(jié)果,每個(gè)數(shù)據(jù)中都有這個(gè)屬性
_source:數(shù)據(jù)對(duì)象信息關(guān)鍵字。
9 過(guò)濾結(jié)果
不想顯示那么多字段,只想顯示其中的 name 和 desc 字段,可以使用 數(shù)據(jù)對(duì)象信息關(guān)鍵字 :_source 來(lái)限定顯示的字段。
GET fenganchen/user/_search {"query": {"match": {"name": "馮凡利"}},"_source": ["name", "desc"] }
我們之后使用java操作es,所有的方法和對(duì)象就是這里面的key:這個(gè)key也就是 hits、score等關(guān)鍵字
10. 排序
GET fenganchen/user/_search {"query": {"match": {"name": "馮凡利"}},"sort": [{"age": {"order": "asc"}}] }11. 分頁(yè)查詢(xún)
GET fenganchen/user/_search {"query": {"match": {"name": "馮凡利"}},"sort": [{"age": {"order": "desc"}}],"from": 0,"size": 1 }
from: 從第幾個(gè)數(shù)據(jù)開(kāi)始
size:返回多少條數(shù)據(jù)(單頁(yè)面的數(shù)據(jù))
數(shù)據(jù)下標(biāo)還是從0開(kāi)始,和學(xué)的所有數(shù)據(jù)結(jié)構(gòu)是一樣的!
/search/{current}/{pagesize}
12. 布爾查詢(xún)
13. 過(guò)濾器
包含 馮凡利 字符串的都會(huì)被查找出來(lái)GET fenganchen/user/_search {"query": {"bool": {"must": [{"match": {"name": "馮凡利"}}]}} }
filter 關(guān)鍵字,對(duì)查詢(xún)的數(shù)據(jù)進(jìn)行過(guò)濾。
- gt 大于
- gte 大于等于
- lt 小于
- lte 小于等于
14. 空格 匹配多個(gè)條件
match 關(guān)鍵字 空格
多個(gè)條件,使用空格隔開(kāi)
只要瞞住其中一個(gè)結(jié)果就可以查出
這個(gè)時(shí)候可以通過(guò) _score 分值進(jìn)行基本的判斷
下面的查詢(xún)語(yǔ)句意思:在tags 字段中找到有 男、技術(shù) 的數(shù)據(jù)給查詢(xún)出來(lái)
15. term 精確查詢(xún)
i. term分析
term 查詢(xún) 是直接通過(guò)倒排索引指定的詞條進(jìn)程精確的查找的!
關(guān)于分詞:
-
term :直接查詢(xún) 精確的
-
match :會(huì)使用分詞器解析!(先分析文檔,然后再通過(guò)分析進(jìn)行查詢(xún)!)
ii. 兩個(gè)類(lèi)型 text keyword 細(xì)節(jié)分析
兩個(gè)類(lèi)型 text keyword 不能被分詞器使用
text類(lèi)型 :可以被分詞
keyword類(lèi)型 :不可以被分詞
先創(chuàng)建索引,并指定屬性規(guī)則,如下:
a. 6版本創(chuàng)建索引,指定規(guī)則
elasticsearch 6.X 創(chuàng)建索引 必須要指定類(lèi)型,feng_type 就是索引的類(lèi)型名稱(chēng)
```json PUT testdb {"mappings": {"feng_type": {"properties": {"name": {"type": "text"},"desc": {"type": "keyword"}}}} } ```b. 7版本創(chuàng)建索引,指定規(guī)則
elasticsearch 7.x 創(chuàng)建索引 不用指定類(lèi)型,因?yàn)?版本廢棄了類(lèi)型關(guān)鍵詞(這里不再演示,我這里使用的是 6.4.2 版本。)
```json PUT testdb {"mappings": {"properties": {"name": {"type": "text"},"desc": {"type": "keyword"}}} } ```c. 添加數(shù)據(jù)
```json PUT testdb/feng_type/1 {"name": "馮凡利java name","desc": "馮凡利java desc" }PUT testdb/feng_type/2 {"name": "馮凡利java name","desc": "馮凡利java desc2" } ``` 添加文檔 1
添加文檔 2
d. elasticsearch-head 的Google插件,查看 testdb 索引數(shù)據(jù)
e. elasticsearch-head 的Google插件,查看 testdb 映射規(guī)則
索引情況,能查看索引的 setting 詳情,和 mapperings 映射規(guī)則 包括類(lèi)型、屬性情況。
可以看到,name 屬性 是 text 類(lèi)型的,desc 是 keyword 類(lèi)型的。
f. 默認(rèn)分詞器測(cè)試:keyword
KeywordAnalyzer 把整個(gè)輸入作為一個(gè)單獨(dú)詞匯單元,方便特殊類(lèi)型的文本進(jìn)行索引和檢索。針對(duì)郵政編碼,地址等文本信息使用關(guān)鍵詞分詞器進(jìn)行索引項(xiàng)建立非常方便。
使用默認(rèn)的 keyword 分詞器進(jìn)行分詞,(說(shuō)一下,ik分詞器是中文分詞器),這里看的出來(lái)沒(méi)有被分析
g. 默認(rèn)分詞器測(cè)試:standard
英文的處理能力同于StopAnalyzer,支持中文采用的方法為單字切分。他會(huì)將詞匯單元轉(zhuǎn)換成小寫(xiě)形式,并去除停用詞和標(biāo)點(diǎn)符號(hào)。
使用默認(rèn)的 standard 分詞器進(jìn)行分詞,,這里看的出來(lái)被分析了
h. term 精確查找 text類(lèi)型
i. term 精確查找 keyword 類(lèi)型
j. 對(duì)h和i的測(cè)試進(jìn)行 總結(jié)
testdb索引中的 :
name字段為 text類(lèi)型,
desc字段為 keyword類(lèi)型。
但是 term 分別對(duì)其 精確查找時(shí),卻發(fā)現(xiàn):
16. 多個(gè)詞精確拼配
a. 添加多數(shù)
PUT testdb/feng_type/3 {"t1": "22","t2": "2020-4-6" }PUT testdb/feng_type/4 {"t1": "33","t2": "2020-4-7" }
b. 查看elasticsearch-head 的Google插件,查看 testdb 索引數(shù)據(jù)和映射規(guī)則。
c. term 精確查詢(xún)
17. 高亮顯示
這些 mysql也可以做,只是mysql效率比較低
- 匹配
- 按照條件匹配
- 精確匹配
- 區(qū)間范圍匹配
- 多條件查詢(xún)
- 高亮查詢(xún)
總結(jié)
以上是生活随笔為你收集整理的elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 近世代数 笔记和题型连载:第一章(代数系
- 下一篇: netscape.javascript.