- Elastic Stack應(yīng)用寶典
- 田雪松編著
- 1643字
- 2020-07-22 17:21:28
4.1 _search接口
_search接口可以使用GET或POST方法請(qǐng)求,在請(qǐng)求路徑中可以指定一個(gè)或多個(gè)索引,還可以使用_all或者星號(hào)“*”匹配所有索引。如果不指定索引名稱,實(shí)際上也是匹配所有索引。Elasticsearch為使用這個(gè)接口定義了一種查詢語(yǔ)言——DSL(Domain Specific Language)。DSL是一套基于JSON的查詢語(yǔ)言,這種只在某一領(lǐng)域使用的語(yǔ)言通常稱為領(lǐng)域特定語(yǔ)言,而它們英文單詞首字母簡(jiǎn)寫(xiě)就是DSL。本書(shū)后續(xù)章節(jié)都將簡(jiǎn)稱這種語(yǔ)言為DSL,由于DSL內(nèi)容非常龐雜,將在本書(shū)第5章單獨(dú)介紹。
_search接口有兩種請(qǐng)求方式,一種是基于URI的請(qǐng)求方式,另一種則是基于請(qǐng)求體的請(qǐng)求方式。無(wú)論是哪一種,它們執(zhí)行的語(yǔ)法根基都是DSL,只是在使用形式上不同而已。
4.1.1 基于URI
_search接口基于URI的請(qǐng)求方式比較簡(jiǎn)單,DSL查詢條件以請(qǐng)求參數(shù)q傳遞給接口。使用_search接口的最簡(jiǎn)形式就是不掛任何參數(shù)直接調(diào)用,可以在路徑中添加索引名稱,也可以不添加。所以示例4-1中的請(qǐng)求都是正確的:

示例4-1 基于URI的_search接口調(diào)用
在最后一個(gè)請(qǐng)求中,參數(shù)q定義的內(nèi)容叫查詢字符串(Query String),它的含義是檢索message字段值中包含chrome或firefox的文檔。查詢字符串不僅可以在基于URI的檢索中使用,也可以在基于請(qǐng)求體的檢索中使用,是DSL定義的一種檢索方法。查詢字符串屬于全文檢索,這意味著查詢字符串在檢索前會(huì)被分析器解析為一系列詞項(xiàng)和運(yùn)算符。以示例4-1中的請(qǐng)求為例,“chrome firefox”會(huì)被解析為chrome和firefox兩個(gè)詞項(xiàng),然后再與message字段的詞項(xiàng)索引做匹配。只要message字段中包含chrome或firefox,這個(gè)文檔就滿足查詢條件。
1.查詢字符串
查詢字符串的基本格式為“<字段名>:<查詢值>”,其中字段名可以指定,也可以不指定。如果沒(méi)有指定字段名,要匹配的字段由index.query.default_field參數(shù)設(shè)置。這個(gè)參數(shù)的默認(rèn)值為*.*,即在所有字段中查詢。此外,還可以使用參數(shù)df(Default Field)指定要查詢的字段名,它與參數(shù)q一樣是可以用在URI中的參數(shù)。如果指定了字段名,查詢將在指定字段中匹配詞項(xiàng)。除了直接指定字段名以外,還可使用通配符等形式匹配字段,例如:

示例4-2 特殊格式的字段名
在示例4-2中,查詢字符串“geo.\ *:CN US”將在geo的子字段中匹配CN或US。第二個(gè)查詢字符串中的_exists_不是一個(gè)具體的字段名,而是代表所有非空的title字段。
下面再來(lái)看看查詢字符串中的查詢值。查詢值會(huì)在檢索前通過(guò)分析器拆分為詞項(xiàng),在檢索時(shí)只要字段中包含任意一個(gè)詞項(xiàng)就視為滿足條件。在實(shí)現(xiàn)上,這其實(shí)是使用了DSL語(yǔ)言中定義的match查詢。如果使用雙引號(hào)將它們括起來(lái),_search接口將使用DSL的match_phrase做短語(yǔ)匹配。從效果上看就類似于用整個(gè)短語(yǔ)做檢索,而不是使用單個(gè)詞項(xiàng)做檢索。查詢值中除了包含詞項(xiàng)本身以外,還可以包含操作符OR和AND,注意它們必須大寫(xiě)否則將被識(shí)別為詞項(xiàng)。例如,“(tom smith)AND jhon”代表的含義是同時(shí)包含tom、jhon或smith、jhon的字段。除了可以包含詞項(xiàng)、操作符以外,查詢字符串的查詢值中還可以包含通配符、正則表達(dá)式等。表4-1給出了一些可能的用法。
表4-1 查詢字符串查詢值的特殊用法

2.請(qǐng)求參數(shù)
基于URI調(diào)用_search接口時(shí)可以使用的參數(shù),除了前述的q和df以外還有很多。例如,_source參數(shù)可以用來(lái)設(shè)置在返回結(jié)果中是否包含_source字段,還可以使用_source_include或_source_exclude參數(shù)包含或排除源文檔的字段。這樣的參數(shù)還有很多,它們大多數(shù)與基于請(qǐng)求體的參數(shù)具有相同的名稱和含義。不僅如此,部分參數(shù)對(duì)于其他接口也可使用,所以對(duì)于參數(shù)的介紹將在本章4.2節(jié)統(tǒng)一講解。表4-2先將這些參數(shù)總結(jié)出來(lái)供參考:
表4-2 基于URI的_search接口參數(shù)

4.1.2 基于請(qǐng)求體
基本請(qǐng)求體的接口調(diào)用,可以在請(qǐng)求體中傳遞DSL檢索條件。盡管可以GET或POST方法請(qǐng)求_search接口,但由于一些客戶端不支持使用GET方法發(fā)送請(qǐng)求體,所以最好使用POST方法請(qǐng)求基于請(qǐng)求體的_search接口。使用請(qǐng)求體檢索時(shí),DSL檢索條件通過(guò)請(qǐng)求體的query參數(shù)設(shè)置。例如檢索目的地為中國(guó)的航班:


示例4-3 基于請(qǐng)求體的檢索
在示例4-3的檢索中,采用了DSL基于詞項(xiàng)(Term)的查詢,檢索條件是DestCountry為CN。DSL中最簡(jiǎn)單的查詢關(guān)鍵字是match_all和match_none,它們分別代表匹配所有和都不匹配。例如:

示例4-4 match_all和match_none
除了這兩種查詢以外,DSL還定義了多種多樣的查詢語(yǔ)法,有關(guān)DSL的具體語(yǔ)法將在本書(shū)第5章做全面介紹。在請(qǐng)求體中可以使用的參數(shù)除了query以外還有很多,它們很多與表4-2中的URI參數(shù)名稱和含義都是相同的,接下來(lái)兩個(gè)小節(jié)將對(duì)一些重要的參數(shù)做介紹。
- 企業(yè)級(jí)Java EE架構(gòu)設(shè)計(jì)精深實(shí)踐
- Ceph Cookbook
- PHP基礎(chǔ)案例教程
- The React Workshop
- Java虛擬機(jī)字節(jié)碼:從入門(mén)到實(shí)戰(zhàn)
- Mastering KnockoutJS
- C語(yǔ)言課程設(shè)計(jì)
- PySpark Cookbook
- Learning Concurrency in Kotlin
- C專家編程
- 算法圖解
- Julia High Performance(Second Edition)
- 零基礎(chǔ)學(xué)C++(升級(jí)版)
- Python趣味創(chuàng)意編程
- 系統(tǒng)分析師UML用例實(shí)戰(zhàn)