ES與RDBMS數(shù)據(jù)庫(kù)比較
簡(jiǎn)單對(duì)比
RDBMS | Elasticsearch | 備注 |
---|---|---|
Database(數(shù)據(jù)庫(kù)) | Index(索引) | |
Table(表) | Type(類(lèi)型) | ES6.x后一個(gè)index對(duì)應(yīng)一個(gè)type |
Row(行) | Docment(文檔) | es保存json |
Column(列) | Field(字段) | |
Schema(約束) | Mapping(映射) | 只能說(shuō)類(lèi)似祥绞,不完全一樣 |
Index(所以) | Everything is indexed(萬(wàn)物皆為索引) | es中存儲(chǔ)數(shù)據(jù)都是索引 |
SQL(結(jié)構(gòu)化查詢(xún)語(yǔ)言) | DSL(ES獨(dú)特的查詢(xún)語(yǔ)言) |
索引
1沪伙、結(jié)構(gòu)化索引
針對(duì)字段類(lèi)型: 日期、時(shí)間膏秫、數(shù)字類(lèi)型沮趣,以及精確的文本匹配堤瘤。
結(jié)構(gòu)化檢索特點(diǎn):
- 結(jié)構(gòu)化查詢(xún)浩淘,我們得到的結(jié)果 總是 非是即否泉哈,要么存于集合之中,要么存在集合之外肖粮。
- 結(jié)構(gòu)化查詢(xún)不關(guān)心文件的相關(guān)度或評(píng)分孤页;它簡(jiǎn)單的對(duì)文檔包括或排除處理。
1.1 精確值查找
1.1.1 單個(gè)精確值查找(term query)
term 查詢(xún)是簡(jiǎn)單查詢(xún)涩馆,接受一個(gè)字段名和參數(shù)行施,進(jìn)行精準(zhǔn)查詢(xún),類(lèi)似sql中:
select * from logs where level ='INFO'
ES中對(duì)應(yīng)的DSL如下:
GET logstash-logs-api-2019.03/_search
{
"query": {
"term": {
"level": {
"value": "INFO"
}
}
}
}
1.1.2 字符串類(lèi)型精確查詢(xún)
在ES5.x及以上版本魂那,字符串類(lèi)型需設(shè)置為keyword或text類(lèi)型蛾号,根據(jù)類(lèi)型來(lái)進(jìn)行精確值匹配。
當(dāng)進(jìn)行精確值查詢(xún)涯雅,可以使用過(guò)濾器鲜结,因?yàn)檫^(guò)濾器的執(zhí)行非常快活逆,不會(huì)計(jì)算相關(guān)度(ES會(huì)計(jì)算查詢(xún)?cè)u(píng)分),且過(guò)濾器查詢(xún)結(jié)果容易被緩存精刷。
GET test_index/user/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"school": "world"
}
},
"boost": 1.2
}
}
}
1.1.3 布爾過(guò)濾器
bool過(guò)濾器組成部分:
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
"filter": []
}
}
- must 所有的語(yǔ)句都 必須(must) 匹配,與 AND 等價(jià)蔗候。
- must_not 所有的語(yǔ)句都 不能(must not) 匹配怒允,與 NOT 等價(jià)。
- should 至少有一個(gè)語(yǔ)句要匹配锈遥,與 OR 等價(jià)纫事。
- filter 必須匹配,運(yùn)行在非評(píng)分&過(guò)濾模式所灸。
當(dāng)我們需要多個(gè)過(guò)濾器時(shí)丽惶,只須將它們置入 bool 過(guò)濾器的不同部分即可。
1.1.4 多值精確查詢(xún)(terms query)
terms是包含的意思庆寺,如下:
GET test_index/_search
{
"query": {
"terms": {
"name": [
"奧尼爾",
"麥迪"
]
}
}
}
name包含["奧尼爾","麥迪"]
返回結(jié)果:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "user",
"_id": "9lrZpGkBcbRJikqNMPkF",
"_score": 1,
"_source": {
"name": "奧尼爾"
}
},
{
"_index": "test_index",
"_type": "user",
"_id": "91rZpGkBcbRJikqNNPm5",
"_score": 1,
"_source": {
"name": "麥迪"
}
}
]
}
}
1.2 范圍檢索(range query)
range查詢(xún)可同時(shí)提供包含(inclusive)和不包含(exclusive)這兩種范圍表達(dá)式蚊夫,可供組合的選項(xiàng)如下:
gt: > 大于(greater than)
lt: < 小于(less than)
gte: >= 大于或等于(greater than or equal to)
lte: <= 小于或等于(less than or equal to)
類(lèi)似sql中的范圍查詢(xún):
SELECT document FROM test_index WHERE age BETWEEN 10 AND 30
ES中對(duì)應(yīng)的DSL如下:
GET test_index/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"age": {
"gte": 10,
"lte": 30
}
}
}
]
}
}
}
1.3 存在與否檢索(exist query)
如下sql,age不為null:
SELECT * FROM test_index WHERE age IS NOT NULL
ES中對(duì)應(yīng)的DSL如下:
GET test_index/_search
{
"query": {
"bool": {
"must": {
"exists": {
"field": "age"
}
}
}
}
}
如下sql懦尝,age為null:
SELECT * FROM test_index WHERE age IS NULL
ES中對(duì)應(yīng)的DSL如下:
GET test_index/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "age"
}
}
}
}
}
注:missing查詢(xún)?cè)?.x版本已經(jīng)不存在知纷。
1.4 前綴檢索(Prefix Query)
匹配包含 not analyzed(未分詞分析)的前綴字符:
GET test_index/_search
{
"query": {
"prefix": {
"name": {
"value": "奧"
}
}
}
}
1.5 通配符檢索( Wildcard Query)
匹配具有匹配通配符表達(dá)式( (not analyzed )的字段的文檔壤圃。 支持的通配符:
1)* 它匹配任何字符序列(包括空字符序列);
2)? 它匹配任何單個(gè)字符琅轧。
請(qǐng)注意伍绳,此查詢(xún)可能很慢,因?yàn)樗枰闅v多個(gè)術(shù)語(yǔ)乍桂。
為了防止非常慢的通配符查詢(xún)冲杀,通配符不能以任何一個(gè)通配符*****或?開(kāi)頭。
GET test_index/_search
{
"query": {
"wildcard": {
"name": {
"value": "奧*"
}
}
}
}
1.6 正則表達(dá)式檢索(Regexp Query)
正則表達(dá)式查詢(xún)?cè)试S您使用正則表達(dá)式術(shù)語(yǔ)查詢(xún)睹酌。
舉例如下:
GET /_search
{
"query": {
"regexp":{
"name.first": "s.*y"
}
}
}
注意: *的匹配會(huì)非常慢权谁,你需要使用一個(gè)長(zhǎng)的前綴,
通常類(lèi)似.*?+通配符查詢(xún)的正則檢索性能會(huì)非常低憋沿。
1.7 模糊檢索(Fuzzy Query)
模糊查詢(xún)查找在模糊度中指定的最大編輯距離內(nèi)的所有可能的匹配項(xiàng)旺芽,然后檢查術(shù)語(yǔ)字典,以找出在索引中實(shí)際存在待檢索的關(guān)鍵詞辐啄。
GET test_index/_search
{
"query": {
"fuzzy": {
"name": {"value": "奧尼爾"}
}
}
}
1.8 類(lèi)型檢索(Type Query)
舉例:
GET test_index/_search
{
"query": {
"type":{
"value":"user"
}
}
}
檢索索引test_index中采章,type為user的全部信息。不過(guò)在es6.x版本壶辜,一個(gè)index僅有一個(gè)type悯舟,未來(lái)es7.x版本,將取消type砸民,所以這個(gè)查詢(xún)沒(méi)啥意義抵怎。
1.9 Ids檢索(Ids Query)
返回指定id的全部信息。
GET test_index/_search
{
"query": {
"ids": {
"values": ["-FresmkBcbRJikqNGfkf","-VresmkBcbRJikqNQfli"]
}
}
}
2阱洪、全文檢索
全文檢索查詢(xún)便贵,是通過(guò)分析器菠镇,對(duì)查詢(xún)條件進(jìn)行分析冗荸,然后在全文本字段進(jìn)行全文查詢(xún)。
全文搜索取決于mapping中設(shè)定的analyzer(分析器)利耍,這里使用的是ik分詞器蚌本。
所以在進(jìn)行查詢(xún)開(kāi)發(fā)時(shí)候,需要先了解index的mapping隘梨,從而選擇查詢(xún)方式程癌。
2.1 匹配檢索(Match Query)
匹配查詢(xún)接受文本/數(shù)字/日期類(lèi)型,分析它們轴猎,并構(gòu)造查詢(xún)嵌莉。
對(duì)查詢(xún)傳入?yún)?shù)進(jìn)行分詞,搜索詞語(yǔ)相同文檔捻脖。
GET logstash-productspus/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"ProductOriginalName": "激光"
}
}
]
}
}
}
2.2 匹配短語(yǔ)檢索(Match_Phrase Query)
match_phrase查詢(xún)分析文本锐峭,并從分析文本中創(chuàng)建短語(yǔ)查詢(xún)中鼠。
GET logstash-productspus/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"ProductOriginalName": "激光"
}
}
]
}
}
}
2.3 匹配解析前綴檢索(Match_Phrase_Prefix)
用戶(hù)已經(jīng)漸漸習(xí)慣在輸完查詢(xún)內(nèi)容之前,就能為他們展現(xiàn)搜索結(jié)果沿癞,這就是所謂的即時(shí)搜索(instant search) 或輸入即搜索(search-as-you-type) 援雇。
不僅用戶(hù)能在更短的時(shí)間內(nèi)得到搜索結(jié)果,我們也能引導(dǎo)用戶(hù)搜索索引中真實(shí)存在的結(jié)果椎扬。
例如惫搏,如果用戶(hù)輸入 johnnie walker bl ,我們希望在它們完成輸入搜索條件前就能得到: Johnnie Walker Black Label 和 Johnnie Walker Blue Label 蚕涤。
match_phrase_prefix與match_phrase相同筐赔,除了它允許文本中最后一個(gè)術(shù)語(yǔ)的前綴匹配。
GET logstash-productspus/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase_prefix": {
"ProductOriginalName": "WJD"
}
}
]
}
}
}