一、Elasticsearch創(chuàng)建/查看/刪除索引、創(chuàng)建/查看/修改/刪除文檔、映射關系
1.1 Elasticsearch中的數(shù)據(jù)格式
Elasticsearch 是面向文檔型數(shù)據(jù)庫,一條數(shù)據(jù)在這里就是一個文檔。為了方便大家理解,我們將 Elasticsearch
里存儲文檔數(shù)據(jù)和關系型數(shù)據(jù)庫 MySQL 存儲數(shù)據(jù)的概念進行一個類比。
ES 里的 Index 可以看做一個庫,而 Types 相當于表,Documents 則相當于表的行。這里 Types
的概念已經(jīng)被逐漸弱化,Elasticsearch 6.X 中,一個 index 下已經(jīng)只能包含一個 type,Elasticsearch 7.X 中, Type 的概念已經(jīng)被刪除了。
1.2 索引操作
1.2.1 創(chuàng)建索引
在ES中創(chuàng)建一個索引,就相當于在mysql中創(chuàng)建了一個數(shù)據(jù)庫,而mysql中的數(shù)據(jù)庫肯定是不能重復的,也即ES中的索引也不能重復,所以這是一個冪等性操作,需要發(fā)送PUT請求(如果重復發(fā)送PUT請求、重復添加索引,會返回錯誤信息),這里不能發(fā)送POST請求。
1.2.2 查看指定索引
在postman中,向ES服務器發(fā)送GET請求。這里的路徑和上邊的創(chuàng)建索引是一樣的,只是請求方式不一樣
1.2.3 查看全部索引
在 Postman 中,向 ES 服務器發(fā) GET 請求。
health 當前服務器健康狀態(tài):green(集群完整) yellow(單點正常、集群不完整) red(單點不正常)
status索引打開、關閉狀態(tài)
index 索引名
uuid 索引統(tǒng)一編號
pri 主分片數(shù)量
rep 副本數(shù)量
docs.count 可用文檔數(shù)量
docs.deleted 文檔刪除狀態(tài)(邏輯刪除)
store.size 主分片和副分片整體占空間大小
pri.store.size 主分片占空間大小
1.2.4 刪除索引
在 Postman 中,向 ES 服務器發(fā) DELETE 請求。
1.3 文檔操作
1.3.1 創(chuàng)建文檔
索引已經(jīng)創(chuàng)建好了,接下來我們來創(chuàng)建文檔,并添加數(shù)據(jù)。這里的文檔可以類比為關系型數(shù)據(jù)庫中的表數(shù)據(jù),添加的數(shù)據(jù)格式為 JSON 格式
在 Postman 中,向 ES 服務器發(fā) POST 請求。
{
"title":"小米手機",
"category":"小米",
"image":"http://www.szh.com/szh.jpg",
"price":3999.00
}
上面的數(shù)據(jù)創(chuàng)建后,由于沒有指定數(shù)據(jù)唯一性標識(ID),默認情況下,ES 服務器會隨機生成一個。
如果想要自定義唯一性標識,需要在創(chuàng)建時指定。推薦使用下面這種方式創(chuàng)建文檔。
1.3.2 查看單個文檔:主鍵查詢
查看文檔時,需要指明文檔的唯一性標識,類似于 MySQL 中數(shù)據(jù)的主鍵查詢。在 Postman 中,向 ES 服務器發(fā) GET 請求。
1.3.3 查看所有文檔:全查詢
“query”:這里的query代表一個查詢對象,里面可以有不同的查詢屬性
“match_all”:查詢類型,例如:match_all(代表查詢所有),match,term,range等等
{查詢條件}:查詢條件會根據(jù)類型的不同,寫法也有差異
1.3.4 修改文檔中的全部字段
修改數(shù)據(jù)時,也可以只修改某一給條數(shù)據(jù)的局部信息,也可以修改所有字段信息。
修完完之后,再次發(fā)送GET請求,查看修改后的文檔內容。
{
"title":"OPPO手機",
"category":"OPPO",
"images":"http://www.szh.com/szh.jpg",
"price":2400.00
}
1.3.5 修改文檔中的某個字段
{
"doc" : {
"title":"VIVO手機",
"category":"VIVO"
}
}
1.3.6 刪除文檔
刪除一個文檔不會立即從磁盤上移除,它只是被標記成已刪除(邏輯刪除)。在 Postman 中,向 ES 服務器發(fā) DELETE 請求。
1.3.7 條件查詢文檔內容
match 匹配類型查詢,會把查詢條件進行分詞,然后進行查詢,多個詞條之間是 or 的關系。
在 Postman 中,向 ES 服務器發(fā) GET 請求。
上面這種查詢方式的請求參數(shù)是直接跟在請求路徑之后的,這種方式不太好,因為可能會造成亂碼問題。
所以一般采用下面這種方式,將請求參數(shù)存放在請求體中。
{
"query" : {
"match" : {
"category" : "華為"
}
}
}
1.3.8 分頁查詢+排序文檔內容
默認情況下,Elasticsearch 在搜索的結果中,會把文檔中保存在_source
的所有字段都返回。如果我們只想獲取其中的部分字段,我們可以添加_source 的過濾sort 可以讓我們按照不同的字段進行排序,并且通過 order 指定排序的方式。desc 降序,asc 升序。
from:當前頁的起始索引,默認從 0 開始。 from = (pageNum - 1) * size。
size:每頁顯示多少條。
{
"query" : {
"match_all" : {
}
},
"from" : 0, // (頁碼-1)*每頁條數(shù), 第一頁:(1-1)*2=0, 第二頁:(2-1)*2=2
"size" : 2,
"_source" : ["title","price"],
"sort" : {
"price" : {
"order" : "desc"
}
}
}
1.3.9 多條件查詢:and
bool把各種其它查詢通過must(必須 and )、must_not(必須不)、should(應該 or)的方式進行組合 。
{
"query" : {
"bool" : {
"must" : [
{
"match" : {
"category" : "小米"
}
},
{
"match" : {
"price" : 3999.00
}
}
]
}
}
}
1.3.10 多條件查詢:or
bool把各種其它查詢通過must(必須 and )、must_not(必須不)、should(應該 or)的方式進行組合 。
{
"query" : {
"bool" : {
"should" : [
{
"match" : {
"category" : "VIVO"
}
},
{
"match" : {
"price" : 5999.00
}
}
]
}
}
}
1.3.11 多條件查詢:大于、小于
range 查詢找出那些落在指定區(qū)間內的數(shù)字或者時間。range 查詢允許以下字符: gt 大于> gte 大于等于>= lt 小于<
lte 小于等于<=
{
"query" : {
"bool" : {
"must" : [
{
"match" : {
"category" : "小米"
}
}
],
"filter" : {
"range" : {
"price" : {
"gt" : 3000.00,
"lt" : 4000.00
}
}
}
}
}
}
1.3.12 全文查詢+高亮顯示
在進行關鍵字搜索時,搜索出的內容中的關鍵字會顯示不同的顏色,稱之為高亮。
在使用 match 查詢的同時,加上一個 highlight 屬性:
pre_tags:前置標簽 post_tags:后置標簽 fields:需要高亮的字段 title:這里聲明 title
字段需要高亮,后面可以為這個字段設置特有配置,也可以空
{
"query" : {
"match_phrase" : {
"category" : "小"
}
},
"highlight" : {
"fields" : {
"category" : {}
}
}
}
當我們將查詢條件中的 match_phrase 改為 match 之后,再次查詢,結果仍然是有的。這就很奇怪了,我文檔中分類信息只有 小米 、沒有 小 啊,為什么還能查詢到結果呢? 這是因為ES在保存文檔數(shù)據(jù)時,會將數(shù)據(jù)進行分詞、拆解操作,并將拆解后的數(shù)據(jù)保存到倒排索引中,這樣即使使用文字的一部分(小米可以查詢到、小也可以查詢到)也能查詢到數(shù)據(jù),這種方式就稱為 全文檢索。 也就是說文檔中的category是小米,
通過 小、米、小米 均可以查詢到。
如果我們寫的是 小華,則ES會幫我們查詢出:%小%、%華% 相關的所有數(shù)據(jù),這里就是進行了數(shù)據(jù)分詞、拆解,進而采用倒排索引的方式查詢。
假如說,我不想采用采用這種全文檢索的匹配模式,需要將 match 改為 match_phrase。
1.3.13 聚合查詢:根據(jù)價格分組、對價格求平均值
聚合允許使用者對 es 文檔進行統(tǒng)計分析,類似與關系型數(shù)據(jù)庫中的 group by,當然還有很多其他的聚合,例如取最大值、平均值等等。
對某個字段取最大值 max
對某個字段取最小值 min
對某個字段求和 sum
對某個字段取平均值 avg
對某個字段的值進行去重之后再取總數(shù) distinct
{
"aggs" : { //聚合操作
"price_group" : { //名稱,自定義
"terms" : { //分組
"field" : "price" //分組字段
}
}
},
"size" : 0
}
{
"aggs" : { //聚合操作
"price_avg" : { //名稱,自定義
"avg" : { //分組
"field" : "price" //分組字段
}
}
},
"size" : 0
}
1.4 映射操作
有了索引庫,等于有了數(shù)據(jù)庫中的 database。
接下來就需要建索引庫(index)中的映射了,類似于數(shù)據(jù)庫(database)中的表結構(table)。創(chuàng)建數(shù)據(jù)庫表需要設置字段名稱,類型,長度,約束等;索引庫也一樣,需要知道這個類型下有哪些字段,每個字段有哪些約束信息,這就叫做映射(mapping)。
字段名:任意填寫,下面指定許多屬性,例如:title、subtitle、images、price
type:類型,Elasticsearch 中支持的數(shù)據(jù)類型非常豐富,說幾個關鍵的: ? String 類型,又分兩種: ?
text:可分詞
keyword:不可分詞,數(shù)據(jù)會作為完整字段進行匹配 ? Numerical:數(shù)值類型,分兩類 ?
基本數(shù)據(jù)類型:long、integer、short、byte、double、float、half_float ?
浮點數(shù)的高精度類型:scaled_float ? Date:日期類型 ? Array:數(shù)組類型 ? Object:對象
index:是否索引,默認為 true,也就是說你不進行任何配置,所有字段都會被索引。 ? true:字段會被索引,則可以用來進行搜索 ?
false:字段不會被索引,不能用來搜索store:是否將數(shù)據(jù)進行獨立存儲,默認為 false ? 原始的文本會存儲在_source
里面,默認情況下其他提取出來的字段都不是獨立存儲的,是從_source
里面提取出來的。當然你也可以獨立的存儲某個字段,只要設置"store": true 即可,獲取獨立存儲的字段要比從_source
中解析快得多,但是也會占用更多的空間,所以要根據(jù)實際業(yè)務需求來設置analyzer:分詞器,這里的 ik_max_word 即使用 ik 分詞器
首先是 http://127.0.0.1:9200/user ,發(fā)送PUT請求,創(chuàng)建一個user索引,然后在這個索引下創(chuàng)建一個映射。
就類似于在mysql中創(chuàng)建一個名為 user 的數(shù)據(jù)庫,在這個數(shù)據(jù)庫中定義一張表的結構如下:??????
text 類型為true表示 name 字段可以支持 分詞、拆解 操作的查詢;而 keyword 類型為true表示 sex
字段僅支持完全匹配的模式;最后 keyword 類型為false表示 tel 字段不支持查詢。
{
"properties" : {
"name" : {
"type" : "text",
"index" : true
},
"sex" : {
"type" : "keyword",
"index" : true
},
"tel" : {
"type" : "keyword",
"index" : false
}
}
}
索引有了,映射也有了(數(shù)據(jù)庫有了,表結構有了,就差向表中添加數(shù)據(jù)了),也就是需要添加文檔內容。
因為name字段是支持text模式查詢,即支持分詞、拆解操作,做倒排索引,所以雖然文檔中的name字段為張起靈,但是經(jīng)過分詞拆解,name為徐、鳳、年、鳳年這幾種都可以查詢出數(shù)據(jù)。
由于 sex 字段不支持text分詞拆解,僅支持keyword完全匹配的模式,所以源文檔數(shù)據(jù)中 sex 為 man,這里只寫個 m
是查詢不到的。
最后的tel字段是最苛刻的,壓根不支持text、keyword兩種查詢,所以這里就算是寫成和文檔中的 tel 一樣,也查詢不到,因為 tel 字段不支持查詢。
文章來源:http://www.zghlxwxcb.cn/news/detail-410722.html
二、參考鏈接
分布式全文搜索引擎 Elasticsearch文章來源地址http://www.zghlxwxcb.cn/news/detail-410722.html
到了這里,關于551、Elasticsearch詳細入門教程系列 -【分布式全文搜索引擎 Elasticsearch(二)】 2023.04.04的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!