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