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
表示我們要進行搜尋
- q 指定查詢内容
- df 指定查詢字段
- sort 指定字段排序
- from 偏移量
- size 擷取資料量 與from聯合使用 做分頁的
- 下面有個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"
}
}
}
}
複制
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5SZnhTYktGd55WbvwVOxQTO5gzMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
這個順序就不能反,否則查詢不到。那如果需要查
tag
為
java,laravel
中間是随意字元的話就需要
slop
這樣就是實作中間模糊查詢。
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
查詢确切的語句,在對查詢字段定義了分詞器的情況下,會使用分詞器對輸入進行分詞,然後傳回滿足下述兩個條件的文檔
- match_phase中的所有term都出現在待查詢字段之中
- 待查詢字段之中的所有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
中的查詢條件有相同的順序。