ElasticSearch進階檢索

ElasticSearch進階檢索

入門檢索中講了如何導入elastic提供的樣本測試數據,下面咱們用這些數據進一步檢索html

1、SearchAPI

ES 支持兩種基本方式檢索 :

一、一種是經過使用 REST request URI 發送搜索參數(uri+檢索參數)

​ GET bank/_search 檢索 bank 下全部信息,包括 type 和 docsapi

​ GET bank/_search?q=*&sort=account_number:asc 請求參數方式檢索數組

二、另外一種是經過使用 REST request body 來發送它們(uri+請求體)

GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "account_number": "asc"
    }
  ]
}
# query 查詢條件
# sort 排序條件

響應結果

響應結果

響應結果解釋:

took - 執行搜索的時間(毫秒)dom

time_out - 告訴咱們搜索是否超時elasticsearch

_shards - 告訴咱們多少個分片被搜索了,以及統計了成功/失敗的搜索分片ide

hits - 搜索結果函數

hits.total - 搜索結果條數測試

hits.hits - 實際的搜索結果數組(默認爲前 10 的文檔)優化

sort - 結果的排序 key(鍵)(沒有則按 score 排序)ui

score 和 max_score –相關性得分和最高得分(全文檢索用)

2、Query DSL

一、基本語法格式

Elasticsearch 提供了一個能夠執行查詢的 Json 風格的 DSLdomain-specific language 領域特

定語言)。這個被稱爲 Query DSL。

一個查詢語句的典型結構:

QUERY_NAME:{
   ARGUMENT:VALUE,
   ARGUMENT:VALUE,...
}

若是針對於某個字段,那麼它的結構以下:

{
  QUERY_NAME:{
     FIELD_NAME:{
       ARGUMENT:VALUE,
       ARGUMENT:VALUE,...
      }   
   }
}

請求示例

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "from":0,
  "size":5,
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ]
}
#query 定義如何查詢
#match_all 查詢類型【表明查詢全部的全部】,es 中能夠在 query 中組合很是多的查詢類型完成複雜查詢
#除了 query 參數以外,咱們也能夠傳遞其它的參數以改變查詢結果。如 sort,size from+size 限定完成分頁
#sort 排序,多字段排序,會在前序字段相等時後續字段內部排序,不然之前序爲準

二、返回部分字段

_source:須要返回哪些字段寫在數組中便可

響應結果

三、match【匹配查詢】

(1)對於基本數據類型的(非字符串),進行精確匹配

GET bank/_search
{
  "query": {
    "match": {
      "account_number": 10
    }
  }
}
#match 返回 account_number=10 的

(2)對於字符串類型的字段,進行全文檢索,模糊匹配

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  }
}
#最終查詢出 address 中包含 mill 單詞的全部記錄
#match 當搜索字符串類型的時候,會進行全文檢索,而且每條記錄有相關性得分

(3)字符串,多個單詞(分詞+全文檢索)

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill road"
    }
  }
}
#最終查詢出 address 中包含 mill 或者 road 或者 mill road 的全部記錄,並給出相關性得分(_score),也會按照這個評分排序

(4)精確匹配文本字符串

GET bank/_search
{
  "query": {
    "match": {
      "address.keyword": " Mill road"
    }
  }
}
# 查找 address徹底爲Mill Street 的數據

四、match_phrase【短語匹配】

將須要匹配的值當成一個總體單詞(不分詞)進行檢索

GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill road"
    }
  }
}
#查出 address 中包含 mill road 的全部記錄,並給出相關性得分

五、multi_match【多字段匹配】

GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": [
        "city","address"
      ]
    }
  }
}
#檢索 city 或 address 匹配包含 mill 的數據,會對查詢條件分詞

六、bool【複合查詢】

bool 用來作複合查詢: 複合語句能夠合併任何其它查詢語句,包括複合語句,複合語句之間能夠互相嵌套,能夠表達很是複雜的邏輯

(1)must:必須達到must所列舉的全部條件

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"firstname": "Forbes"}},
        {"match": {"gender": "M"}}
      ]
    }
  }
}

(2)must_not 必須不是指定的狀況

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"firstname": "Forbes"}},
        {"match": {"gender": "M"}}
      ],
      "must_not": [
        {"match": {"lastname": "Wallace"}}
      ]
    }
  }
}

(3)should:應該達到 should列舉的條件

若是達到會增長相關文檔的評分並不會改變 查詢的結果。若是 query 中只有 should 且只有一種匹配規則,那麼 should 的條件就會被做爲默認匹配條件而去改變查詢結果

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"address": "mill"}},
        {"match": { "gender": "M" }}
      ],
      "should": [ {"match": { "address": "lane" }} ]
    }
  }
}
#應該匹配,匹配到能增長文檔相關性得分,匹配不到也不會影響查詢結果

七、filter【結果過濾】

不是全部的查詢都須要計算相關性得分,僅用於 「filtering」(過濾)的文檔。爲了避免計算分數 Elasticsearch 會自動檢查場景而且優化查詢的執行。

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"address": "mill"}}
      ],
      "filter": [
        {"range": {
          "balance": {
            "gte": 10000,
            "lte": 20000
          }
        }}
      ]
    }
  }
}
#range範圍查詢,大於1000小於20000

八、term精確檢索

避免使用 term 查詢文本字段,默認狀況下,Elasticsearch 會經過analysis分詞將文本字段的值拆分爲一部分,這使精確匹配文本字段的值變得困難。若是要查詢文本字段值,請使用 match 查詢代替。

和 match 同樣,匹配某個屬性的值。全文檢索字段用 match其餘非 text 字段匹配用 term

GET bank/_search
{
  "query": {
    "term": {
      "age": "20"
    }
  }
}

九、Aggregation-執行聚合

聚合提供了從數據中分組和提取數據的能力。最簡單的聚合方法大體等於 SQL GROUP BY 和 SQL聚合函數。

詳細的介紹能夠查看官網關於Aggregation的文檔,下面提供幾個示例來看一下聚合

https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-aggregations.html

(1)搜索address中包含 mill的全部人的年齡分佈以及平均年齡,但不顯示這些人的詳情

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "age"
      }
    },
    "avg_age":{
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}
#size:0 不顯示搜索數據
#aggs:執行聚合。聚合語法以下:
#"aggs": {
    "aggs_name 此次聚合的名字,方便展現在結果集中": {
      "AGG_TYPE 聚合的類型(avg,term,terms)": {
        "field": "age"
      }
    }
 }

(2)按照年齡聚合,而且請求這些年齡段的這些人的平均薪資

GET bank/_search
{
  "query": {"match_all": {}},
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "age"
      },
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
            
          }
        }
      }
    }
  }
}
#其實就是aggs裏面又加了一個aggs,第二個aggs根據第一個aggs聚合後的結果在聚合

(3)查出全部年齡分佈,而且這些年齡段中 性別爲M 的平均薪資和 性別爲F 的平均薪資以及這個年齡

段的整體平均薪資

GET bank/_search
{
  "query": {"match_all": {}},
  "aggs": {
    "age_avg":{
      "terms": {
        "field": "age",
        "size": 1000
      },
      "aggs": {
        "gender_avg": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },
          "aggs": {
            "balance_avg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "balance_avg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}
相關文章
相關標籤/搜索