1. 程式人生 > 其它 >ElasticSearch學習筆記十(詞項查詢)

ElasticSearch學習筆記十(詞項查詢)

技術標籤:ElasticSearchelasticsearch

本學習筆記基於ElasticSearch 7.10版本,舊版本已經廢棄的查詢功能暫時不做筆記,以後有涉及到再做補充。
參考官方文件:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/term-level-queries.html

今一章,咱們來學習簡單的詞項查詢,也就是 term 查詢,以及以 term 延伸的詞項查詢。在之前的文章中,我們已經多次涉及到這個技能點,但是沒有細講,今天我們就來從頭理一下 term 查詢。

一、term

term 不會對查詢字元進行分詞,直接拿查詢字元去倒排索引中比對。

GET books/_search
{
  "query": {
    "term": {
      "name": "java"
    }
  }
}

二、terms

使用多個關鍵字進行查詢,引數為陣列型別,關鍵字之間的關係為 OR 。

GET books/_search
{
  "query": {
    "terms": {
      "name": ["程式","設計","java"
] } } }

2.1、Terms lookup

terms 中除了簡單的多個關鍵字查詢,還支援 Terms lookup 巢狀查詢,先查詢獲取已知文件的欄位值,然後再將這些值用作關鍵字查詢其他文件,有點類似於關係型資料庫中的子查詢,支援跨欄位或者跨索引。

首先介紹一下 Terms lookup 的引數:

  • index : 必輸,已知文件所在的索引。
  • id:必輸,已知文件的ID。
  • path:必輸,需要獲取的文件欄位值。
  • routing:選輸,文件的路由值,如果在為文件建立索引時提供了自定義路由值,則此引數是必需的。

程式碼演示:

# 新建索引,新增一個文件,name 欄位包含三個作者的名字
PUT author PUT author/_doc/1 { "name": ["吳堯", "朱家雄", "朱彥鵬,羅曉輝,周勇"] } # 使用 author 索引中 id 為 1 的 name 欄位值作為查詢關鍵字 GET books/_search { "query": { "terms": { "author": { "index": "author", "id": "1", "path": "name" } } } }

注意:
預設情況下,Elasticsearch 將 terms 查詢限制為最多65536個關鍵字,包括 Terms lookup 查詢出來的關鍵字,可以通過 index.max_terms_count修改限制。

三、range

range 可以進行範圍查詢,按照日期範圍、數字範圍等查詢。
range 中的主要引數:

  • gt : 大於。
  • gte:大於或等於。
  • lt:小於。
  • lte:小於或等於。
  • format:日期格式,如果不指定將使用 mapping 中定義日期格式。
  • relation:指定範圍查詢如何匹配 range 欄位的值,可選值為:
    • INTERSECTS (預設值):將文件的範圍欄位值與查詢範圍相交。
    • CONTAINS:使用範圍欄位值完全包含查詢範圍的文件進行匹配。
    • WITHIN:使用範圍欄位值完全在查詢範圍內的文件進行匹配。
GET books/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 20
      }
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

四、exists

exists 可以判斷欄位是否為空,可以指定多個欄位,只返回指定欄位中至少有一個非空值的文件:

# books 中不存在 amby 欄位
GET books/_search
{
  "query": {
    "exists": {
      "field": "amby"
    }
  }
}

注意: 空字串也是有值,null 才是空值。

五、prefix

prefix 用於字首查詢,效率略低,除非必要,一般不推薦使用。

GET books/_search
{
  "query": {
    "prefix": {
      "name": {
        "value": "大學"
      }
    }
  }
}

六、wildcard

wildcard 即萬用字元查詢,支援單字元 ? 和多字元 *

# 查詢所有姓張的作者的書
GET books/_search
{
  "query": {
    "wildcard": {
      "author": {
        "value": "張*"
      }
    }
  }
}
# 查詢所有姓張並且名字只有兩個字的作者的書
GET books/_search
{
  "query": {
    "wildcard": {
      "author": {
        "value": "張?"
      }
    }
  }
}

七、regexp

正則表示式查詢:

# 查詢所有姓張並且名字只有兩個字的作者的書
GET books/_search
{
  "query": {
    "regexp": {
      "author": "張."
    }
  }
}

八、fuzzy

在實際搜尋中,有時我們可能會打錯字,從而導致搜尋不到,在 match 全文查詢中,可以通過 fuzziness 屬性實現模糊查詢。

而在詞項查詢中,就可以使用fuzzy 查詢與搜尋關鍵字相似的文件。
怎麼樣就算相似?以 LevenShtein 編輯距離為準。編輯距離是指將一個字元變為另一個字元所需要更改字元的次數,更改主要包括四種:

  • 更改字元 ( javb >> java )
  • 刪除字元 ( javva >> java )
  • 插入字元 ( jaa >> java )
  • 轉置字元 ( jaav >> java )

為了找到相似的詞,模糊查詢會在指定的編輯距離中建立搜尋關鍵詞的所有可能變化或者擴充套件的集合,然後進行搜尋匹配。

GET books/_search
{
  "query": {
    "fuzzy": {
      "name": "javba"
    }
  }
}

九、ids

根據指定的 id 查詢對應的文件。

GET books/_search
{
  "query": {
    "ids":{
      "values":  [1,2,3]
    }
  }
}

版權宣告:

本文僅記錄ElasticSearch學習心得,如有侵權請聯絡刪除。
更多內容請訪問原創作者:江南一點雨
微信公眾號:江南一點雨