天天看點

Elasticsearch 利用API進行搜尋

ES

在搜尋上對外開放了

Resultful API

, 友善各個語言調用,那麼他調用有兩種方式,一種就是單純将搜尋的參數放到

url

上,還有就是可以放到

Request Body

裡面,我們來依次看看。

URL Search 路由攜帶參數搜尋

GET movies/_search?q=love&df=title&sort=year:asc&from=0&size=10
{
  "profile": "true"
}           

複制

我們來對上面的

url

分析一下,

movies

是索引,

_search

表示我們要進行搜尋

  1. q 指定查詢内容
  2. df 指定查詢字段
  3. sort 指定字段排序
  4. from 偏移量
  5. size 擷取資料量 與from聯合使用 做分頁的
  6. 下面有個profile 是為了查詢執行過程
  • or 查詢
# 等效為or查詢
GET movies/_search?q=title:(Beautiful OR Mind)
{
  "profile": "true"
}           

複制

  • and 查詢
GET movies/_search?q=title:(Beautiful AND Mind)
{
  "profile": "true"
}           

複制

  • 範圍查詢
GET movies/_search?q=year:[2018 TO 2019]
{
  "profile": "true"
}           

複制

[] 為閉區間,{} 為開區間

year:[2018 TO 2019],查詢時間在2018-2019年的電影

  • 模糊查詢

"Avengers War"~2 ,

Avengers

War

之間有兩個

term

,比對

Avengers: Infinity War - Part I

,不能比對

Avengers: War

GET /movies/_search?q=title:"Avengers War"~2
{
  "profile": "true"
}           

複制

Request Body Search 請求體攜帶Json搜尋

其實在高階使用方法上隻有

Request Body Search

才能實作,是以也是推薦使用這種方法查詢學習。

POST test/_search
{
  "profile": "true",
  "_source": ["name", "date"], # 指定展示的字段
  "from": 0, # 分頁偏移
  "size": 20, # 總共擷取20
  "sort": [ # 排序
    {
      "date": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "match_all": {} # 查詢所有文檔
  }
}           

複制

Match 查詢表達式

POST test/_search
{
  "query": {
    "match": {
      "name": "王    五"
    }
  }
}           

複制

這樣會比對到

name

字段中帶

或者帶

的文檔,類似于

OR

關系,如果你隻需要王五的話,可以添加

and

操作

POST test/_search
{
  "query": {
    "match": {
      "name": {
        "query": "王五",
        "operator": "and"
      }
      
    }
  }
}           

複制

Match Phrase

通過使用

query-match_phrase

實作

Phrase

查詢,

query

的詞必須按照順序排列,

slop

實作模糊查詢,

slop=1

,表示中間可以有一個字元

POST test/_search
{
  "query": {
    "match_phrase": {
      "tag": {
        "query": "java php"
      }
      
    }
  }
}           

複制

Elasticsearch 利用API進行搜尋

這個順序就不能反,否則查詢不到。那如果需要查

tag

java,laravel

中間是随意字元的話就需要

slop

Elasticsearch 利用API進行搜尋

這樣就是實作中間模糊查詢。

Request Body Search中間 match, match_phrase, term的差別

  • term

term

結構化字段查詢,比對一個值,且輸入的值不會被分詞器分詞。

{
    "query":{
        "term":{
            "foo": "hello world"
        }
    }
}           

複制

那麼隻有在字段中存儲了

hello world

的資料才會被傳回,如果在存儲時,使用了分詞,原有的文本

“I say hello world”

會被分詞進行存儲,不會存在

“hello world”

這整個詞,那麼不會傳回任何值。

但是如果使用

“hello”

作為查詢條件,則隻要資料中包含

“hello”

的資料都會被傳回,分詞對這個查詢影響較大。

  • match_phase

查詢确切的語句,在對查詢字段定義了分詞器的情況下,會使用分詞器對輸入進行分詞,然後傳回滿足下述兩個條件的文檔

  1. match_phase中的所有term都出現在待查詢字段之中
  2. 待查詢字段之中的所有term都必須和match_phase具有相同的順序
{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }           

複制

使用match_phase:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}           

複制

會傳回前兩條文檔。

  • match

模糊比對,先對輸入進行分詞,對分詞後的結果進行查詢,文檔中隻要包含

match

查詢條件的一部分就會傳回

  • query_string

query_string

文法查詢,同

match_phase

的相同點在于,輸入的查詢條件會被分詞,但是不同之處在與文檔中的資料可以不用和

query_string

中的查詢條件有相同的順序。