elasticsearch Query DSL(一)
本文參考官方提供api提煉出來的
https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
Query DSL
Elasticsearch提供基於JSON的完整查詢DSL(域特定語言)來定義查詢。將Query DSL視為查詢的AST(抽象語法樹),由兩種型別的子句組成:
- Leaf query clauses
葉查詢子句中尋找一個特定的值在某一特定領域,如 match
,term
或 range
查詢。這些查詢可以單獨使用。
- Compound query clauses
複合查詢子句包裝其他葉子或複合查詢,用於以邏輯方式(例如bool
或dis_max
查詢)組合多個查詢 ,或者更改其行為(例如 constant_score
查詢)。
查詢子句的行為有所不同,具體取決於它們是在 查詢上下文還是過濾器上下文中使用。
Query和filter
query子句的行為取決於它是在查詢上下文中還是在過濾器上下文中使用:
query
查詢上下文中使用的查詢子句回答了問題“ 此文件與此查詢子句的匹配程度如何?“除了判斷文件是否匹配之外,查詢子句還計算_score表示文件相對於其他文件的匹配程度。
查詢上下文是有效每當查詢子句被傳遞給一個query引數,如query該引數search的API。
filter
在過濾器上下文中,查詢子句回答問題“ 此文件是否與此查詢子句匹配?“答案是簡單的是或否 - 沒有計算得分。過濾器上下文主要用於過濾結構化資料,例如
- 這是否timestamp屬於2015年至2016年的範圍?
- 在status 欄位設定為"published"?
Elasticsearch會自動快取經常使用的過濾器,以加快效能。
只要將查詢子句傳遞給filter 引數(例如查詢中的filter或mustnot引數, bool查詢中的filter引數 constantscore或filter聚合), 過濾器上下文就會生效。
GET / _search { “query” :{ “bool” :{ “必須” :[ { “匹配” :{ “title” :“搜尋” }}, { “match” :{ “content” :“Elasticsearch” }} ],“過濾器” :[ { “term” :{ “status” :“已釋出” }}, { “range” :{ “publish_date” :{ “gte” :“2015-01-01” }}} ] } } }
Match All
最簡單的查詢,匹配所有文件,給他們所有_score 的1.0。
GET /_search
{
"query": {
"match_all": { "boost" : 1.2 }
}
}
match_none
這是match_all查詢的反轉,它不匹配任何文件。
GET /_search
{
"query": {
"match_none": {}
}
}
Full text queries
高階全文查詢通常用於在全文欄位(如電子郵件正文)上執行全文查詢。他們瞭解如何分析被查詢的欄位,並在執行之前將每個欄位 analyzer(或search_analyzer)應用於查詢字串。
Match
用於執行全文查詢的標準查詢,包括模糊匹配和短語或鄰近查詢。
GET /_search
{
"query": {
"match" : {
"message" : "this is a test"
}
}
}
Match查詢型別為boolean。這意味著文字是可分析的,分析過程根據提供的文字構造布林查詢。該operator標誌可以設定為or或and用來控制布林子句(預設為or)。should可以使用minimumshouldmatch 引數設定要匹配的最小可選子句數。如果要檢索的field,是not_analyzed型別的,那麼match query也相當於term query。
所述analyzer可以被設定為控制哪個分析器將在文字上執行的分析過程。它預設為欄位顯式對映定義或預設搜尋分析器。
該lenient引數可以設定為true忽略造成的資料型別不匹配的異常,如想查詢的數字欄位與文字查詢字串。預設為false。
Fuzziness
fuzziness允許基於被查詢的欄位型別進行模糊匹配。
prefixlength和maxexpansions可以在這種情況下,以控制模糊處理來設定。如果設定了模糊選項,則查詢將使用toptermsblendedfreqs${maxexpansions} 其重寫方法,該fuzzyrewrite引數允許控制如何重寫查詢。
預設情況下允許模糊轉置(ab→ ba),但可以通過設定fuzzy_transpositions為禁用false。
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "this is a test",
"operator" : "and"
}
}
}
}
Zero terms query
如果使用的分析器刪除了像stop過濾器那樣的查詢中的所有標記,則預設行為是根本不匹配任何文件。為了更改zerotermsquery可以使用的選項,它接受 none(預設)並且all對應於match_all查詢。
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "to be or not to be",
"operator" : "and",
"zero_terms_query": "all"
}
}
}
}
Cutoff frequency
匹配查詢支援cutoff_frequency允許指定絕對或相對文件頻率,其中高頻項被移動到可選子查詢中,並且僅在or運算子或所有子項中的低頻率(低於截止值)項之一時進行評分 。在and 運營商匹配的情況下的低頻項。
此查詢允許stopwords在執行時動態處理,與域無關,並且不需要停用檔案。它可以防止評分/迭代高頻術語,並且只有在更重要/更低頻率的術語與文件匹配時才考慮這些術語。然而,如果所有查詢項都高於給定cutoff_frequency的查詢,則會自動將查詢轉換為純的conj(and)查詢以確保快速執行。
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "to be or not to be",
"cutoff_frequency" : 0.001
}
}
}
}
Synonyms
match查詢支援使用synonym_graph標記過濾器進行多項同義詞擴充套件。使用此過濾器時,解析器會為每個多項同義詞建立一個短語查詢。以下同義詞:"ny, new york" would produce:(ny OR ("new york"))
GET /_search
{
"query": {
"match" : {
"message": {
"query" : "ny city",
"auto_generate_synonyms_phrase_query" : false
}
}
}
}
Match phrase
與match查詢類似,但用於匹配精確短語或單詞鄰近匹配。match_phrase查詢分析文字,並建立一個phrase查詢出來的分析文字。短語查詢slop以任何順序匹配最多可配置(預設為0)的術語。轉置條款的斜率為2。
analyzer可以被設定為控制哪個分析器將在文字上執行的分析過程。它預設為欄位顯式對映定義或預設搜尋分析器。
GET /_search
{
"query": {
"match_phrase" : {
"message" : {
"query" : "this is a test",
"analyzer" : "my_analyzer"
}
}
}
}
Match Phrase Prefix
像match_phrase查詢一樣,但是在最後一個單詞上進行萬用字元搜尋。
它還接受一個max_expansions引數(預設值50),該引數可以控制最後一個術語將被擴充套件的字尾數量。強烈建議將其設定為可接受的值以控制查詢的執行時間。
GET /_search
{
"query": {
"match_phrase_prefix" : {
"message" : {
"query" : "quick brown f",
"max_expansions" : 10
}
}
}
}
Multi match
multi_match查詢基礎上的match查詢 ,允許多領域的查詢。
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ]
}
}
}
如果未fields提供,則multimatch查詢預設為index.query.defaultfield 索引設定,而索引設定預設為。提取對映中符合術語查詢條件的所有欄位,並過濾元資料欄位。然後組合所有提取的欄位以構建查詢。
multi_match查詢在內部執行的方式取決於type 引數,該引數可以設定為:
|
(預設)查詢與任何欄位匹配的文件,但使用 |
|
查詢與任何欄位匹配的文件,並組合 |
|
對待欄位與 |
|
|
|
|
Common Terms Query
common terms query將所述查詢術語分為兩組:更重要(即低頻率而言)和不太重要的(即,高頻率而言這將先前已停用詞)。
首先,它搜尋與更重要的術語匹配的文件。這些術語出現在較少的文件中,對相關性有較大影響。
然後,它對不太重要的術語執行第二次查詢 - 這些術語經常出現並且對相關性的影響很小。但是,它不是計算所有匹配文件的相關性分數,而是僅計算_score
已經與第一個查詢匹配的文件。通過這種方式,高頻項可以改善相關性計算,而無需支付效能不佳的成本。
如果查詢僅包含高頻術語,則單個查詢將作為AND
(連線)查詢執行,換句話說,所有術語都是必需的。即使每個單獨的術語與許多文件匹配,術語組合也會將結果集縮小到最相關的範圍。單個查詢也可以作為OR
特定的 查詢執行minimum_should_match
,在這種情況下,應該使用足夠高的值。
根據條件將術語分配給高頻或低頻組 cutoff_frequency
,可以將其指定為絕對頻率(>=1
)或相對頻率(0.0 .. 1.0
)。(請記住,文件頻率是按照每個分片級別計算的,如部落格文章中所述, 相關性已被破壞。)
也許這個查詢最有趣的屬性是它自動適應域特定的停用詞。例如,在視訊託管網站上,常見的術語如"clip"
或"video"
將自動錶現為停用詞而無需維護手動列表。
GET /_search { "query": { "common": { "body": { "query": "nelly the elephant as a cartoon", "cutoff_frequency": 0.001, "low_freq_operator": "and" } } } }
等價
GET /_search { "query": { "bool": { "must": [ { "term": { "body": "nelly"}}, { "term": { "body": "elephant"}}, { "term": { "body": "cartoon"}} ], "should": [ { "term": { "body": "the"}}, { "term": { "body": "as"}}, { "term": { "body": "a"}} ] } } }
Query String Query
支援緊湊的Lucene 查詢字串語法,允許您在單個查詢字串中指定AND | OR | NOT條件和多欄位搜尋。僅限專家使用者。
GET /_search { "query": { "query_string" : { "default_field" : "content", "query" : "this AND that OR thus" } } }
query_string
高層引數包括:
引數 | 描述 |
---|---|
|
要解析的實際查詢。參見查詢字串語法。 |
|
如果未指定字首欄位,則查詢字詞的預設欄位。預設為 |
|
如果未指定顯式運算子,則使用預設運算子。例如,使用預設運算子 |
|
用於分析查詢字串的分析器名稱。 |
|
分析器的名稱,用於分析查詢字串中的引用短語。對於這些部件,它將覆蓋使用 |
|
設定時, |
|
設定為 |
|
控制模糊查詢將擴充套件到的術語數。預設為 |
|
|
|
設定模糊查詢的字首長度。預設是 |
|
設定為 |
|
設定短語的預設斜率。如果為零,則需要精確的短語匹配。預設值是 |
|
設定查詢的提升值。預設為 |
|
預設為 |
|
預設情況下,不分析查詢字串中的萬用字元。通過將此值設定為 |
|
限制允許建立的regexp查詢的自動機狀態數。這可以防止太難(例如指數級硬)的regexp。預設為10000。 |
|
一個值,用於控制生成的布林查詢中應該匹配的“should”子句的數量。它可以是絕對值( |
|
如果設定為 |
|
時區應用於與日期相關的任何範圍查詢。另見 JODA時區。 |
|
附加到查詢字串的引用部分的欄位的字尾。這允許使用具有不同分析鏈的欄位進行精確匹配。看看這裡為一個完整的例子。 |
|
是否應為多項同義詞自動生成短語查詢。預設為 |
|
[ |
Simple Query String Query
一種更簡單,更健壯的query_string
語法版本,適合直接向用戶公開。
使用SimpleQueryParser解析其上下文的查詢。與常規query_string
查詢不同,simple_query_string
查詢永遠不會丟擲異常,並丟棄查詢的無效部分
GET /_search { "query": { "simple_query_string" : { "query": "\"fried eggs\" +(eggplant | potato) -frittata", "fields": ["title^5", "body"], "default_operator": "and" } } }
simple_query_string
高層引數包括:
引數 | 描述 |
---|---|
|
要解析的實際查詢。請參閱下面的語法。 |
|
要執行解析查詢的欄位。預設為 |
|
如果未指定顯式運算子,則使用預設運算子。例如,使用預設運算子 |
|
在建立複合查詢時,強制分析器用於分析查詢的每個術語。 |
|
標誌指定 |
|
是否應自動分析字首查詢的條款。如果 |
|
如果設定為 |
|
要返回的文件必須匹配的最小子句數。有關 |
|
附加到查詢字串的引用部分的欄位的字尾。這允許使用具有不同分析鏈的欄位進行精確匹配。看看這裡為一個完整的例子。 |
|
是否應為多項同義詞自動生成短語查詢。預設為 |
|
[ |
|
設定模糊查詢的字首長度。預設是 |
|
控制模糊查詢將擴充套件到的術語數。預設為 |
|
設定為 |