elasticsearch基本查詢(xún)筆記(三)-- es查詢(xún)總結(jié)

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):

  1. 結(jié)構(gòu)化查詢(xún)浩淘,我們得到的結(jié)果 總是 非是即否泉哈,要么存于集合之中,要么存在集合之外肖粮。
  2. 結(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"
          }
        }
      ]
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揖铜,一起剝皮案震驚了整個(gè)濱河市川陆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛮位,老刑警劉巖较沪,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異失仁,居然都是意外死亡尸曼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)萄焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)控轿,“玉大人,你說(shuō)我怎么就攤上這事拂封〔缟洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵冒签,是天一觀的道長(zhǎng)在抛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)萧恕,這世上最難降的妖魔是什么刚梭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮票唆,結(jié)果婚禮上朴读,老公的妹妹穿的比我還像新娘。我一直安慰自己走趋,他們只是感情好衅金,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般氮唯。 火紅的嫁衣襯著肌膚如雪酥宴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,879評(píng)論 1 290
  • 那天您觉,我揣著相機(jī)與錄音拙寡,去河邊找鬼。 笑死琳水,一個(gè)胖子當(dāng)著我的面吹牛肆糕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播在孝,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诚啃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了私沮?” 一聲冷哼從身側(cè)響起始赎,我...
    開(kāi)封第一講書(shū)人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仔燕,沒(méi)想到半個(gè)月后造垛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晰搀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年五辽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片外恕。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杆逗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳞疲,到底是詐尸還是另有隱情罪郊,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布尚洽,位于F島的核電站悔橄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翎朱。R本人自食惡果不足惜橄维,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一尺铣、第九天 我趴在偏房一處隱蔽的房頂上張望拴曲。 院中可真熱鬧,春花似錦凛忿、人聲如沸澈灼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叁熔。三九已至委乌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荣回,已是汗流浹背遭贸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留心软,地道東北人壕吹。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像删铃,于是被迫代替她去往敵國(guó)和親耳贬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 搜索機(jī)制 搜索的流程圖如下: 1猎唁,文檔寫(xiě)入ES的時(shí)候咒劲,ES中會(huì)存儲(chǔ)兩份數(shù)據(jù)。一份是文檔的原始數(shù)據(jù)诫隅,即_source...
    吃火龍果吐芝麻閱讀 2,325評(píng)論 0 2
  • Neil Zhu腐魂,簡(jiǎn)書(shū)ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist...
    朱小虎XiaohuZhu閱讀 13,210評(píng)論 0 5
  • * ES集群會(huì)在生產(chǎn)環(huán)境被長(zhǎng)期實(shí)踐, 一些重要概念, 包括應(yīng)用和優(yōu)化調(diào)試方法值得記錄分享 * 所以, 會(huì)有關(guān)于ES...
    君劍閱讀 2,158評(píng)論 0 0
  • Elastic+logstash+head簡(jiǎn)單介紹 一. 概述 ElasticSearch是一個(gè)基于Lucene的...
    柒月失凄閱讀 4,251評(píng)論 0 4
  • 今生今世永遠(yuǎn)愛(ài)你逐纬。就讓我永遠(yuǎn)愛(ài)你吧挤渔!這的話已經(jīng)鎖在我的記憶里了,那鑰匙你就替我保管一輩子吧风题。 當(dāng)我第一眼看到你的時(shí)...
    愛(ài)瓜瓜閱讀 165評(píng)論 0 0