濟南建設網站的公司seo快速培訓
1. 文檔(Document)
在ES中一個文檔是一個可被索引的基礎信息單元,也就是一條數據
比如:你可以擁有某一個客戶的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON(Javascript?Object?Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
在一個index/type里面,你可以存儲任意多的文檔。
1.1?創(chuàng)建文檔
POST?users/_doc
{
"user"?:?"Mike",
??"post_date"?:?"2019-04-15T14:12:12",
??"message"?:?"trying?out?Kibana"
}
PUT?users/_doc/1?op_type=create
{"user" : "Jack","post_date" : "2019-05-15T14:12:12","message" : "trying?out?Elasticsearch"
}
1.2?查看文檔
GET?users/_doc/1
1.3?更新文檔
POST?users/_doc/1
{"user": "Lucy"
}
GET?users/_doc/1
在原文檔上增加字段
POST?users/_update/1/
{"doc":{"post_date" : "2019-05-15T14:12:12","message" : "trying?out?Elasticsearch"}
}
再次查看結果
1.4??刪除文檔
DELETE?users/_doc/1
條件刪除
POST?users/_delete_by_query
{"query":{"match": {"user": "Mike"}}
}
2. 字段(Field)
相當于是數據表的字段,對文檔數據根據不同屬性進行的分類標識。
3. 映射(Mapping)
mapping是處理數據的方式和規(guī)則方面做一些限制,如:某個字段的數據類型、默認值、分析器、是否被索引等等。這些都是映射里面可以設置的,其它就是處理ES里面數據的一些使用規(guī)則設置也叫做映射,按著最優(yōu)規(guī)則處理數據對性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能對性能更好。
3.1?創(chuàng)建映射
PUT?/studentPUT?/student/_mapping
{"properties": {"name":{"type": "text","index": true},"sex":{"type": "text","index": true},"age":{"type": "long","index": true}}
}
映射數據說明:
l字段名:任意填寫,下面指定許多屬性,例如:title、subtitle、images、price
ltype:類型,Elasticsearch中支持的數據類型非常豐富,說幾個關鍵的:
nString類型,又分兩種:
text:可分詞
keyword:不可分詞,數據會作為完整字段進行匹配
nNumerical:數值類型,分兩類
基本數據類型:long、integer、short、byte、double、float、half_float
浮點數的高精度類型:scaled_float
nDate:日期類型
nArray:數組類型
nObject:對象
lindex:是否索引,默認為true,也就是說你不進行任何配置,所有字段都會被索引。
true:字段會被索引,則可以用來進行搜索
false:字段不會被索引,不能用來搜索
lstore:是否將數據進行獨立存儲,默認為false
原始的文本會存儲在_source里面,默認情況下其他提取出來的字段都不是獨立存儲的,是從_source里面提取出來的。當然你也可以獨立的存儲某個字段,只要設置"store":?true即可,獲取獨立存儲的字段要比從_source中解析快得多,但是也會占用更多的空間,所以要根據實際業(yè)務需求來設置。
lanalyzer:分詞器,這里的ik_max_word即使用ik分詞器。
3.2?查看映射
GET?/student/_mapping
3.3?索引映射關聯
PUT?/student1
{"settings": {},"mappings": {"properties": {"name":{"type": "text","index": true},"sex":{"type": "text","index": false},"age":{"type": "long","index": false}}}
}
4. ES高級查詢
Elasticsearch提供了基于JSON提供完整的查詢DSL來定義查詢
定義數據?:
POST?/student/_doc/1001
{
"name":"zhangsan",
"nickname":"zhangsan","sex":"男","age":30
}
POST?/student/_doc/1002
{
"name":"lisi",
"nickname":"lisi","sex":"男","age":20
}
POST?/student/_doc/1003
{
"name":"wangwu","nickname":"wangwu","sex":"女","age":40
}
POST?/student/_doc/1004
{
"name":"zhangsan1",
"nickname":"zhangsan1","sex":"女","age":50
}
POST?/student/_doc/1005
{
"name":"zhangsan2",
"nickname":"zhangsan2","sex":"女","age":30
}
4.1?查詢所有文檔:match_all
term查詢,精確的關鍵詞匹配查詢,不對查詢條件進行分詞。
GET?/student/_search
{"query":{"match_all": {}}
}
4.2?匹配查詢:match
GET?/student/_search
{"query": {"match": {"name": "zhangsan"}}
}
4.3?字段匹配查詢:multi_match
GET?/student/_search
{"query": {"multi_match": {"query": "zhangsan","fields": ["name",?"nickname"]}}
}
4.4?關鍵字精確查詢:term
GET?/student/_search
{"query": {"term": {"name": {"value": "wangwu"}}}
}
4.5?多關鍵字精確查詢:terms
terms?查詢和?term?查詢一樣,但它允許你指定多值進行匹配。
如果這個字段包含了指定值中的任何一個值,那么這個文檔滿足條件,類似于mysql的in
GET?/student/_search
{"query": {"terms": {"name": ["zhangsan","lisi"]}}
}
4.6?指定返回字段_source
默認情況下,Elasticsearch在搜索的結果中,會把文檔中保存在_source的所有字段都返回。
如果我們只想獲取其中的部分字段,我們可以添加_source的過濾
GET?/student/_search
{"_source": "name",?"query": {"terms": {"name": ["zhangsan"]}}
}
4.7?過濾字段:includes
我們也可以通過:
includes:來指定想要顯示的字段
excludes:來指定不想要顯示的字段
GET?/student/_search
{"_source": {"includes": ["name","nickname"]},??"query": {"terms": {"nickname": ["zhangsan"]}}
}
GET?/student/_search
{"_source": {"excludes": ["name","nickname"]},??"query": {"terms": {"nickname": ["zhangsan"]}}
}
4.8?組合查詢:bool
bool把各種其它查詢通過must(必須?)、must_not(必須不)、should(應該)的方式進行組合
GET?/student/_search
{"query": {"bool": {"must": [{"match": {"name": "zhangsan"}}],"must_not": [{"match": {"age": 40}}],"should": [{"match": {"sex": "男"}}]}}
}
4.9?范圍查詢
range?查詢找出那些落在指定區(qū)間內的數字或者時間。range查詢允許以下字符
操作符 | 說明 |
gt | 大于> |
gte | 大于等于>= |
lt | 小于< |
lte | 小于等于<= |
GET?/student/_search
{"query": {"range": {"age": {"gte": 30,"lte": 35}}}
}
4.10?模糊查詢
返回包含與搜索字詞相似的字詞的文檔。
編輯距離是將一個術語轉換為另一個術語所需的一個字符更改的次數。這些更改可以包括:
更改字符(box?→?fox)
刪除字符(black?→?lack)
插入字符(sic?→?sick)
轉置兩個相鄰字符(act?→?cat)
為了找到相似的術語,fuzzy查詢會在指定的編輯距離內創(chuàng)建一組搜索詞的所有可能的變體或擴展。然后查詢返回每個擴展的完全匹配。
通過fuzziness修改編輯距離。一般使用默認值AUTO,根據術語的長度生成編輯距離。
GET?/student/_search
{"query": {"fuzzy": {"name": {"value": "zhangsan"}}}
}
4.11?單字段排序
sort?可以讓我們按照不同的字段進行排序,并且通過order指定排序的方式。desc降序,asc升序。
GET?/student/_search
{"query": {"fuzzy": {"name": "zhangsan"}},"sort": [{"age": {"order" : "desc"}}]
}
4.12?多字段排序
假定我們想要結合使用?age和?_score進行查詢,并且匹配的結果首先按照年齡排序,然后按照相關性得分排序
GET?/student/_search
{"query": {"fuzzy": {"name": "zhangsan"}},"sort": [{"age": {"order" : "desc"}},{"_score": {"order": "desc"}}]
}
4.13?高亮查詢
在進行關鍵字搜索時,搜索出的內容中的關鍵字會顯示不同的顏色,稱之為高亮。
在Bing搜索"大數據"
Elasticsearch可以對查詢內容中的關鍵字部分,進行標簽和樣式(高亮)的設置。
在使用match查詢的同時,加上一個highlight屬性:
lpre_tags:前置標簽
lpost_tags:后置標簽
lfields:需要高亮的字段
title:這里聲明title字段需要高亮,后面可以為這個字段設置特有配置,也可以空
GET?/student/_search
{"query": {"match": {"name": "zhangsan"}},"highlight": {"pre_tags": "<font?color='red'>","post_tags": "</font>","fields": {"name": {}}}
}
4.14?分頁查詢
from:當前頁的起始索引,默認從0開始。?from?=?(pageNum?-?1)?*?size
size:每頁顯示多少條
GET?/student/_search
{"query": {"match_all": {}},"sort": [{"age": {"order": "desc"}}],"from": 0,"size": 2
}
4.15?聚合查詢
聚合允許使用者對es文檔進行統(tǒng)計分析,類似與關系型數據庫中的group?by,當然還有很多其他的聚合,例如取最大值、平均值等等。
對某個字段取最大值max
GET?/student/_search
{"aggs":{"max_age":{"max":{"field":"age"}}},"size":0
}
4.16?桶聚合查詢
桶聚和相當于sql中的group?by語句
terms聚合,分組統(tǒng)計
GET?/student/_search
{"aggs":{"age_groupby":{"terms":{"field":"age"}}},"size":0
}