es查询所欲_Elasticsearch基本查询总结
Elasticsearch是一個分布式文檔存儲。Elasticsearch不會將信息存儲為列數據的行,而是存儲已序列化為JSON文檔的復雜數據結構。當集群中有多個Elasticsearch節點時,存儲的文檔將分布在集群中,并且可以從任何節點立即訪問。
存儲文檔時,將在1秒鐘內幾乎實時地對其進行索引和完全搜索。Elasticsearch使用稱為倒排索引的數據結構,該結構支持非常快速的全文本搜索。反向索引列出了出現在任何文檔中的每個唯一單詞,并標識了每個單詞出現的所有文檔。
索引可以認為是文檔的優化集合,每個文檔都是字段的集合,這些字段是包含數據的鍵值對。默認情況下,Elasticsearch對每個字段中的所有數據建立索引,并且每個索引字段都具有專用的優化數據結構。例如,文本字段存儲在倒排索引中,數字字段和地理字段存儲在BKD樹中。使用按字段數據結構組合并返回搜索結果的能力使Elasticsearch如此之快。
Elasticsearch還具有無模式的能力,這意味著無需顯式指定如何處理文檔中可能出現的每個不同字段即可對文檔建立索引。啟用動態映射后,Elasticsearch自動檢測并向索引添加新字段。此默認行為使索引和瀏覽數據變得容易-只需開始建立索引文檔,Elasticsearch就會檢測布爾值,浮點數和整數值,日期和字符串并將其映射到適當的Elasticsearch數據類型。
1.ES與常用數據庫比較
2.?查詢操作
Elasticsearch中當我們設置Mapping(分詞器、字段類型)完畢后,就可以按照設定的方式導入數據。
有了數據后,我們就需要對數據進行檢索操作。根據實際開發需要,往往我們需要支持包含但不限于以下類型的檢索:
1)精確匹配,類似mysql中的 “=”操作;
2)模糊匹配,類似mysql中的”like %關鍵詞% “查詢操作;
3)前綴匹配;
4)通配符匹配;
5)正則表達式匹配;
6)跨索引匹配;
7)提升精讀匹配。
細數一下,我們的痛點在于:
1)ES究竟支持哪些檢索操作?
2)如何實現ES精確值檢索、指定索引檢索、全文檢索?
這些就是本文著重參考ES最新官方文檔,針對ES5.X版本探討的內容。
0、檢索概覽
檢索子句的行為取決于查詢應用于過濾(filter)上下文還是查詢/分析(query)上下文。
過濾上下文——對應于結構化檢索
1)核心回答的問題是:“這個文檔是否符合這個查詢條款?”2)答案是簡單的是或否,不計算分數。3)過濾器上下文主要用于過濾結構化數據。類似于Mysql中判定某個字段是否存在:
例如:
a. 時間戳字段:是否屬于2015年或2016年?
b. 狀態字段:是否設置為“已發布”?
經常使用的過濾器將被Elasticsearch**自動緩存,以加快性能**。
分析上下文——對應于全文檢索
1)核心回答了“本文檔與此查詢子句是否匹配?”的問題。
2)除了決定文檔是否匹配之外,查詢子句還會計算一個_score,表示文檔與其他文檔的匹配程度。
綜合應用場景如下:
GET /_search
{"query": { "bool": { "must": [
{"match": { "title": "Search"}},
{"match": { "content": "Elasticsearch"}}
],"filter": [
{"term": { "status": "published"}},
{"range": { "publish_date": { "gte": "2015-01-01"}}}
]
}
}
以上檢索,title中包含”Search”并且content中包含 “Elasticsearch”,status中精確匹配”published”,并且publish_date 大于“2015-01-01”的全部信息。
以下,以“腦圖”的形式直觀展示檢索分類。
其中,3-7根據我隨著我開發深入再做更新。
以下內容的原文需要參考ES官方文檔(隨著版本變化,后續會有更新)
1、結構化檢索
針對字段類型: 日期、時間、數字類型,以及精確的文本匹配。
結構化檢索特點:
* 1)結構化查詢,我們得到的結果 總是 非是即否,要么存于集合之中,要么存在集合之外。
* 2)結構化查詢不關心文件的相關度或評分;它簡單的對文檔包括或排除處理。
1.1 精確值查找
1.1.1 單個精確值查找(term query)
term 查詢會查找我們指定的精確值。term 查詢是簡單的,它接受一個字段名以及我們希望查找的數值。
想要類似mysql中如下sql語句的查詢操作:
SELECT document FROM products WHERE price = 20;
DSL寫法:
GET /my_store/products/_search
{"query": {"term": {"price" : 20}
}
當進行精確值查找時, 我們會使用過濾器(filters)。過濾器很重要,因為它們執行速度非常快,不會計算相關度(直接跳過了整個評分階段)而且很容易被緩存。如下: 使用 constant_score 查詢以非評分模式來執行 term 查詢并以一作為統一評分。
GET /my_store/products/_search
{"query": {"constant_score": {"filter": {"term": {"price" : 20}
}
}
}
注意:5.xES中,對于字符串類型,要進行精確值匹配。需要講類型設置為text和keyword兩種類型。mapping設置如下:
POST testindex/testtype/_mapping
{"testtype":{"properties":{"title":{"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_max_word","fields":{"keyword":{"type":"keyword"}
}
}
}
精確值java api jest使用方法:
searchSourceBuilder.query(QueryBuilders.termQuery(“text.keyword”, “來自新華社的報道”));
1.1.2 布爾過濾器
一個 bool 過濾器由三部分組成:
{"bool": {"must": [],"should": [],"must_not": [],"filter": []
}
}
must ——所有的語句都 必須(must) 匹配,與 AND 等價。
must_not ——所有的語句都 不能(must not) 匹配,與 NOT 等價。
should ——至少有一個語句要匹配,與 OR 等價。
filter——必須匹配,運行在非評分&過濾模式。
就這么簡單! 當我們需要多個過濾器時,只須將它們置入 bool 過濾器的不同部分即可。
舉例:
GET /my_store/products/_search
{"query": {"filtered": {"filter": {"bool": {"should": [
{"term" : {"price" : 20}},
{"term" : {"productID" : "XHDK-A-1293-#fJ3"}}
],"must_not": {"term" : {"price" : 30}
}
}
}
}
}
1.1.3 多個值精確查找(terms query)
{"terms": {"price" : [20, 30]
}
}
如上,terms是包含的意思,包含20或者包含30。
如下實現嚴格意義的精確值檢索, tag_count代表必須匹配的次數為1。
GET /my_index/my_type/_search
{"query": {"constant_score": {"filter": {"bool": {"must": [
{"term" : { "tags" : "search"} },
{"term" : { "tag_count" : 1} }
]
}
}
}
}
}
1.2 范圍檢索(range query)
range 查詢可同時提供包含(inclusive)和不包含(exclusive)這兩種范圍表達式,可供組合的選項如下:
gt: >大于(greater than)
lt:
gte:>= 大于或等于(greater than orequal to)
lte:<= 小于或等于(less than or equal to)
類似Mysql中的范圍查詢:
SELECTdocumentFROMproductsWHERE price BETWEEN 20 AND 40
ES中對應的DSL如下:
GET /my_store/products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"range" : {
"price" : {
"gte" :20,
"lt" :40}
}
}
}
}
}
1.3 存在與否檢索(exist query)
mysql中,有如下sql:
SELECT tags FROM posts WHERE tags IS NOT NULL;
ES中,exist查詢某個字段是否存在:
GET /my_index/posts/_search
{
"query" : {
"constant_score" : {
"filter" : {
"exists" : { "field" : "tags" }
}
}
}
}
若想要exist查詢能匹配null類型,需要設置mapping:
"user": {
"type": "keyword",
"null_value": "_null_"
}
missing查詢在5.x版本已經不存在,改成如下的判定形式:
GET /_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "user"
}
}
}
}
}
1.4 前綴檢索( Prefix Query )
匹配包含 not analyzed 的前綴字符:
GET /_search
{ "query": {
"prefix" : { "user" : "ki" }
}
}
1.5 通配符檢索( wildcard query)
匹配具有匹配通配符表達式( (not analyzed )的字段的文檔。 支持的通配符:
1)*,它匹配任何字符序列(包括空字符序列);
2)?,它匹配任何單個字符。
請注意,此查詢可能很慢,因為它需要遍歷多個術語。
為了防止非常慢的通配符查詢,通配符不能以任何一個通配符*或?開頭。
舉例:
GET /_search
{
"query": {
"wildcard" : { "user" : "ki*y" }
}
}
1.6 正則表達式檢索(regexp query)
正則表達式查詢允許您使用正則表達式術語查詢。
舉例如下:
GET /_search
{
"query": {
"regexp":{
"name.first": "s.*y"
}
}
}
注意: *的匹配會非常慢,你需要使用一個長的前綴,
通常類似.*?+通配符查詢的正則檢索性能會非常低。
1.7 模糊檢索(fuzzy query)
模糊查詢查找在模糊度中指定的最大編輯距離內的所有可能的匹配項,然后檢查術語字典,以找出在索引中實際存在待檢索的關鍵詞。
舉例如下:
GET /_search
{
"query": {
"fuzzy" : { "user" : "ki" }
}
}
1.8 類型檢索(type query)
舉例:
GET /my_index/_search
{
"query": {
"type" : {
"value" : "xext"
}
}
}
已驗證,檢索索引my_index中,type為xext的全部信息。
1.9 Ids檢索(ids query)
返回指定id的全部信息。
GET /my_index/_search
{
"query": {
"ids" : {
"type" : "xext",
"values" : ["2", "4", "100"]}
}
}
2、全文檢索
高級全文查詢通常用于在全文本字段(如電子郵件正文)上運行全文查詢。他們了解如何對被查詢的字段進行分析,并在執行前將每個字段的分析器(或search_analyzer)應用于查詢字符串。
2.1 匹配檢索(match query)
匹配查詢接受文本/數字/日期類型,分析它們,并構造查詢。
1)匹配查詢的類型為boolean。 這意味著分析所提供的文本,并且分析過程從提供的文本構造一個布爾查詢,
可以將運算符標志設置為或以控制布爾子句(默認為或);
2)文本分析取決于mapping中設定的analyzer(中文分詞,我們默認選擇ik分詞器);
3) fuzziness——模糊性允許基于被查詢的字段的類型進行模糊匹配;
4)”operator”: “and”——匹配與操作(默認或操作);
5) “minimum_should_match”: “75%”——這讓我們可以指定必須匹配的詞項數用來表示一個文檔是否相關。
舉例:
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "thisisa test",
"operator" : "and"
}
}
}
}
2.2 匹配解析檢索 match_phrase query
match_phrase查詢分析文本,并從分析文本中創建短語查詢。
類似 match 查詢, match_phrase 查詢首先將查詢字符串解析成一個詞項列表,然后對這些詞項進行搜索,但只保留那些包含 全部 搜索詞項,且 位置 與搜索詞項相同的文檔。
舉例如下:對于 quick fox 的短語搜索可能不會匹配到任何文檔,因為沒有文檔包含的 quick 詞之后緊跟著 fox 。
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
2.3 匹配解析前綴檢索(match_phrase_prefix)
用戶已經漸漸習慣在輸完查詢內容之前,就能為他們展現搜索結果,這就是所謂的 即時搜索(instant search) 或 輸入即搜索(search-as-you-type) 。
不僅用戶能在更短的時間內得到搜索結果,我們也能引導用戶搜索索引中真實存在的結果。
例如,如果用戶輸入 johnnie walker bl ,我們希望在它們完成輸入搜索條件前就能得到:
Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。
match_phrase_prefix與match_phrase相同,除了它允許文本中最后一個術語的前綴匹配。
舉例:
GET /_search
{
“query”:{
“match_phrase_prefix”:{
“message”:“quick brown f”
}
}
}
2.4 多字段匹配檢索( multi_match query)
multi_match 查詢為能在多個字段上反復執行相同查詢提供了一種便捷方式。
默認情況下,查詢的類型是 best_fields, 這表示它會為每個字段生成一個 match 查詢。
舉例1:”fields”: “*_title”
——任何與模糊模式正則匹配的字段都會被包括在搜索條件中, 例如可以左側的方式同時匹配 book_title 、 chapter_title 和 section_title (書名、章名、節名)這三個字段。
舉例2: “fields”: [ “*_title”, “chapter_title^2” ]
——可以使用 ^ 字符語法為單個字段提升權重,在字段名稱的末尾添加 ^boost , 其中 boost 是一個浮點數。
舉例3:”fields”: [ “first_name”, “last_name” ],
“operator”: “and”
——兩個字段必須都包含。
GET /_search
{
"query": {
"multi_match" : {
"query": "thisisa test",
"fields":["subject", "message"]}
}
}
2.5 字符串檢索(query_string)
一個使用查詢解析器解析其內容的查詢。
query_string查詢提供了以簡明的簡寫語法執行多匹配查詢 multi_match queries ,布爾查詢 bool queries ,提升得分 boosting ,模糊匹配 fuzzy matching ,通配符 wildcards ,正則表達式 regexp 和范圍查詢 range queries 的方式。
支持參數達10幾種。
GET /_search
{
"query": {
"query_string" : {
"default_field" : "content",
"query" : "thisAND that ORthus"
}
}
}
2.6 簡化字符串檢索(simple_query_string)
一個使用SimpleQueryParser解析其上下文的查詢。 與常規query_string查詢不同,simple_query_string查詢永遠不會拋出異常,并丟棄查詢的無效部分。
舉例:
GET /_search
{
"query": {
"simple_query_string" : {
"fields" :["content"],
"query" : "foo bar-baz"
}
}
}
支持的操作如下:
1)+表示AND操作
2)| 表示OR操作
3)- 否定操作
4)*在術語結束時表示前綴查詢
5)(和)表示優先
總結
以上是生活随笔為你收集整理的es查询所欲_Elasticsearch基本查询总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 485通讯线是几芯的_485总线,通讯线
- 下一篇: 转移到ios下载安卓_安卓和IOS角色互