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

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

  1. 結(jié)構(gòu)化查詢,我們得到的結(jié)果 總是 非是即否,要么存于集合之中,要么存在集合之外。
  2. 結(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"
          }
        }
      ]
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容