ES與RDBMS數(shù)據(jù)庫(kù)比較
簡(jiǎn)單對(duì)比
| RDBMS | Elasticsearch | 備注 |
|---|---|---|
| Database(數(shù)據(jù)庫(kù)) | Index(索引) | |
| Table(表) | Type(類型) | ES6.x后一個(gè)index對(duì)應(yīng)一個(gè)type |
| Row(行) | Docment(文檔) | es保存json |
| Column(列) | Field(字段) | |
| Schema(約束) | Mapping(映射) | 只能說(shuō)類似,不完全一樣 |
| Index(所以) | Everything is indexed(萬(wàn)物皆為索引) | es中存儲(chǔ)數(shù)據(jù)都是索引 |
| SQL(結(jié)構(gòu)化查詢語(yǔ)言) | DSL(ES獨(dú)特的查詢語(yǔ)言) |
索引
1、結(jié)構(gòu)化索引
針對(duì)字段類型: 日期、時(shí)間、數(shù)字類型,以及精確的文本匹配。
結(jié)構(gòu)化檢索特點(diǎn):
- 結(jié)構(gòu)化查詢,我們得到的結(jié)果 總是 非是即否,要么存于集合之中,要么存在集合之外。
- 結(jié)構(gòu)化查詢不關(guān)心文件的相關(guān)度或評(píng)分;它簡(jiǎn)單的對(duì)文檔包括或排除處理。
1.1 精確值查找
1.1.1 單個(gè)精確值查找(term query)
term 查詢是簡(jiǎn)單查詢,接受一個(gè)字段名和參數(shù),進(jìn)行精準(zhǔn)查詢,類似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 字符串類型精確查詢
在ES5.x及以上版本,字符串類型需設(shè)置為keyword或text類型,根據(jù)類型來(lái)進(jìn)行精確值匹配。
當(dāng)進(jìn)行精確值查詢,可以使用過(guò)濾器,因?yàn)檫^(guò)濾器的執(zhí)行非常快,不會(huì)計(jì)算相關(guān)度(ES會(huì)計(jì)算查詢?cè)u(píng)分),且過(guò)濾器查詢結(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 多值精確查詢(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查詢可同時(shí)提供包含(inclusive)和不包含(exclusive)這兩種范圍表達(dá)式,可供組合的選項(xiàng)如下:
gt: > 大于(greater than)
lt: < 小于(less than)
gte: >= 大于或等于(greater than or equal to)
lte: <= 小于或等于(less than or equal to)
類似sql中的范圍查詢:
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查詢?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)注意,此查詢可能很慢,因?yàn)樗枰闅v多個(gè)術(shù)語(yǔ)。
為了防止非常慢的通配符查詢,通配符不能以任何一個(gè)通配符*****或?開(kāi)頭。
GET test_index/_search
{
"query": {
"wildcard": {
"name": {
"value": "奧*"
}
}
}
}
1.6 正則表達(dá)式檢索(Regexp Query)
正則表達(dá)式查詢?cè)试S您使用正則表達(dá)式術(shù)語(yǔ)查詢。
舉例如下:
GET /_search
{
"query": {
"regexp":{
"name.first": "s.*y"
}
}
}
注意: *的匹配會(huì)非常慢,你需要使用一個(gè)長(zhǎng)的前綴,
通常類似.*?+通配符查詢的正則檢索性能會(huì)非常低。
1.7 模糊檢索(Fuzzy Query)
模糊查詢查找在模糊度中指定的最大編輯距離內(nèi)的所有可能的匹配項(xiàng),然后檢查術(shù)語(yǔ)字典,以找出在索引中實(shí)際存在待檢索的關(guān)鍵詞。
GET test_index/_search
{
"query": {
"fuzzy": {
"name": {"value": "奧尼爾"}
}
}
}
1.8 類型檢索(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è)查詢沒(méi)啥意義。
1.9 Ids檢索(Ids Query)
返回指定id的全部信息。
GET test_index/_search
{
"query": {
"ids": {
"values": ["-FresmkBcbRJikqNGfkf","-VresmkBcbRJikqNQfli"]
}
}
}
2、全文檢索
全文檢索查詢,是通過(guò)分析器,對(duì)查詢條件進(jìn)行分析,然后在全文本字段進(jìn)行全文查詢。
全文搜索取決于mapping中設(shè)定的analyzer(分析器),這里使用的是ik分詞器。
所以在進(jìn)行查詢開(kāi)發(fā)時(shí)候,需要先了解index的mapping,從而選擇查詢方式。
2.1 匹配檢索(Match Query)
匹配查詢接受文本/數(shù)字/日期類型,分析它們,并構(gòu)造查詢。
對(duì)查詢傳入?yún)?shù)進(jìn)行分詞,搜索詞語(yǔ)相同文檔。
GET logstash-productspus/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"ProductOriginalName": "激光"
}
}
]
}
}
}
2.2 匹配短語(yǔ)檢索(Match_Phrase Query)
match_phrase查詢分析文本,并從分析文本中創(chuàng)建短語(yǔ)查詢。
GET logstash-productspus/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"ProductOriginalName": "激光"
}
}
]
}
}
}
2.3 匹配解析前綴檢索(Match_Phrase_Prefix)
用戶已經(jīng)漸漸習(xí)慣在輸完查詢內(nèi)容之前,就能為他們展現(xiàn)搜索結(jié)果,這就是所謂的即時(shí)搜索(instant search) 或輸入即搜索(search-as-you-type) 。
不僅用戶能在更短的時(shí)間內(nèi)得到搜索結(jié)果,我們也能引導(dǎo)用戶搜索索引中真實(shí)存在的結(jié)果。
例如,如果用戶輸入 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"
}
}
]
}
}
}