ElasticSearch 全文搜索怎麼玩?

鬆哥原創的 Spring Boot 視頻教程已經殺青,感興趣的小夥伴戳這裏-->Spring Boot+Vue+微人事視頻教程java


最近一兩週,鬆哥會一直和你們分享 Es 中的搜索、聚合分析等查詢相關的內容。前面咱們簡單說了下搜索入門,今天咱們就來看看 Es 中的全文查詢。web

本文是ElasticSearch 系列第 19 篇,和你們聊一聊索引的基本操做,前 18 篇傳送門:微信

  1. 打算出一個 ElasticSearch 教程,誰同意,誰反對?
  2. ElasticSearch 從安裝開始
  3. ElasticSearch 第三彈,核心概念介紹
  4. ElasticSearch 中的中文分詞器該怎麼玩?
  5. ElasticSearch 索引基本操做
  6. ElasticSearch 文檔的添加、獲取以及更新
  7. ElasticSearch 文檔的刪除和批量操做
  8. ElasticSearch 文檔路由,你的數據到底存在哪個分片上?
  9. ElasticSearch 併發的處理方式:鎖和版本控制
  10. ElasticSearch 中的倒排索引究竟是什麼?
  11. ElasticSearch 動態映射與靜態映射
  12. ElasticSearch 四種字段類型詳解
  13. ElasticSearch 中的地理類型和特殊類型
  14. ElasticSearch 23 種映射參數詳解
  15. ElasticSearch 如何配置某個字段的權重?
  16. ElasticSearch 23 種映射參數詳解【3】
  17. ElasticSearch 映射模版
  18. ElasticSearch 搜索入門

全文查詢:併發

若是你們以爲視頻風格還能接受,也能夠看看鬆哥的付費視頻:Spring Boot+Vue+微人事視頻教程less

如下是視頻筆記:編輯器

注意,筆記只是視頻內容的一個簡要記錄,所以筆記內容比較簡單,完整的內容能夠查看視頻。ide

15.ElasticSearch 全文查詢

15.1 match query

match query 會對查詢語句進行分詞,分詞後,若是查詢語句中的任何一個詞項被匹配,則文檔就會被索引到。flex

GET books/_search
{
  "query": {
    "match": {
      "name""美術計算機"
    }
  }
}

這個查詢首先會對 美術計算機 進行分詞,分詞以後,再去查詢,只要文檔中包含一個分詞結果,就回返回文檔。換句話說,默認詞項之間是 OR 的關係,若是想要修改,也能夠改成 AND。url

GET books/_search
{
  "query": {
    "match": {
      "name": {
        "query""美術計算機",
        "operator""and"
      }
    }
  }
}

此時就回要求文檔中必須同時包含 美術計算機 兩個詞。spa

15.2 match_phrase query

match_phrase query 也會對查詢的關鍵字進行分詞,可是它分詞後有兩個特色:

  • 分詞後的詞項順序必須和文檔中詞項的順序一致
  • 全部的詞都必須出如今文檔中

示例以下:

GET books/_search
{
  "query": {
    "match_phrase": {
        "name": {
          "query""十一五計算機",
          "slop": 7
        }
    }
  }
}

query 是查詢的關鍵字,會被分詞器進行分解,分解以後去倒排索引中進行匹配。

slop 是指關鍵字之間的最小距離,可是注意不是關鍵之間間隔的字數。文檔中的字段被分詞器解析以後,解析出來的詞項都包含一個 position 字段表示詞項的位置,查詢短語分詞以後 的 position 之間的間隔要知足 slop 的要求。

15.3 match_phrase_prefix query

這個相似於 match_phrase query,只不過這裏多了一個通配符,match_phrase_prefix 支持最後一個詞項的前綴匹配,可是因爲這種匹配方式效率較低,所以你們做爲了解便可。

GET books/_search
{
  "query": {
    "match_phrase_prefix": {
      "name""計"
    }
  }
}

這個查詢過程,會自動進行單詞匹配,會自動查找以開始的單詞,默認是 50 個,能夠本身控制:

GET books/_search
{
  "query": {
    "match_phrase_prefix": {
      "name": {
        "query""計",
        "max_expansions": 3
      }
    }
  }
}

match_phrase_prefix 是針對分片級別的查詢,假設 max_expansions 爲 1,可能返回多個文檔,可是隻有一個詞,這是咱們預期的結果。有的時候實際返回結果和咱們預期結果並不一致,緣由在於這個查詢是分片級別的,不一樣的分片確實只返回了一個詞,可是結果可能來自不一樣的分片,因此最終會看到多個詞。

15.4 multi_match query

match 查詢的升級版,能夠指定多個查詢域:

GET books/_search
{
  "query": {
    "multi_match": {
      "query""java",
      "fields": ["name","info"]
    }
  }
}

這種查詢方式還能夠指定字段的權重:

GET books/_search
{
  "query": {
    "multi_match": {
      "query""陽光",
      "fields": ["name^4","info"]
    }
  }
}

這個表示關鍵字出如今 name 中的權重是出如今 info 中權重的 4 倍。

15.5 query_string query

query_string 是一種緊密結合 Lucene 的查詢方式,在一個查詢語句中能夠用到 Lucene 的一些查詢語法:

GET books/_search
{
  "query": {
    "query_string": {
      "default_field""name",
      "query""(十一五) AND (計算機)"
    }
  }
}

15.6 simple_query_string

這個是 query_string 的升級,能夠直接使用 +、|、- 代替 AND、OR、NOT 等。

GET books/_search
{
  "query": {
    "simple_query_string": {
      "fields": ["name"],
      "query""(十一五) + (計算機)"
    }
  }
}

查詢結果和 query_string。




往期推薦
0 1

50+ 需求文檔免費下載!

0 2

Spring Security 教程合集

0 3

接了兩個私活,都是血汗錢


本文分享自微信公衆號 - 江南一點雨(a_javaboy)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索