本文參考官方提供api提煉出來的html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search.htmlgit
Elasticsearch提供基於JSON的完整查詢DSL(域特定語言)來定義查詢。將Query DSL視爲查詢的AST(抽象語法樹),由兩種類型的子句組成:github
葉查詢子句中尋找一個特定的值在某一特定領域,如 match
,term
或 range
查詢。這些查詢能夠單獨使用。sql
複合查詢子句包裝其餘葉子或複合查詢,用於以邏輯方式(例如bool
或dis_max
查詢)組合多個查詢 ,或者更改其行爲(例如 constant_score
查詢)。api
查詢子句的行爲有所不一樣,具體取決於它們是在 查詢上下文仍是過濾器上下文中使用。緩存
Query和filterelasticsearch
query子句的行爲取決於它是在查詢上下文中仍是在過濾器上下文中使用:ide
query性能
查詢上下文中使用的查詢子句回答了問題「 此文檔與此查詢子句的匹配程度如何?「除了判斷文檔是否匹配以外,查詢子句還計算_score表示文檔相對於其餘文檔的匹配程度。網站
查詢上下文是有效每當查詢子句被傳遞給一個query參數,如query該參數search的API。
filter
在過濾器上下文中,查詢子句回答問題「 此文檔是否與此查詢子句匹配?「答案是簡單的是或否 - 沒有計算得分。過濾器上下文主要用於過濾結構化數據,例如
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
高層參數包括:
參數 | 描述 |
---|---|
|
要解析的實際查詢。請參閱下面的語法。 |
|
要執行解析查詢的字段。默認爲 |
|
若是未指定顯式運算符,則使用默認運算符。例如,使用默認運算符 |
|
在建立複合查詢時,強制分析器用於分析查詢的每一個術語。 |
|
標誌指定 |
|
是否應自動分析前綴查詢的條款。若是 |
|
若是設置爲 |
|
要返回的文檔必須匹配的最小子句數。有關 |
|
附加到查詢字符串的引用部分的字段的後綴。這容許使用具備不一樣分析鏈的字段進行精確匹配。看看這裏爲一個完整的例子。 |
|
是否應爲多項同義詞自動生成短語查詢。默認爲 |
|
[ |
|
設置模糊查詢的前綴長度。默認是 |
|
控制模糊查詢將擴展到的術語數。默認爲 |
|
設置爲 |