《ElasticSearch查詢》目錄導航:html
字符串的徹底匹配是指字符的大小寫,字符的數量和位置都是相同的,詞條(term)查詢使用字符的徹底匹配方式進行文本搜索,詞條查詢不會分析(analyze)查詢字符串,給定的字段必須徹底匹配詞條查詢中指定的字符串。因爲詞條查詢的字符串是未經分析(analyzed)的詞條,所以,詞條查詢常常用於結構化的數據,例如,數值,日期等,當用於文本搜索時,最好在索引映射中設置字符串字段不被索引,也就是說,設置index屬性爲not_analyzed,不然,只能對該字段進行單詞條搜索,也可使用多字段(fields)屬性,定義一個不被分析的字段,原始字段用於全文搜索,而多字段用於詞條搜索:正則表達式
"properties": { "title":{ "type":"string","index":"analyzed" "fields":{ "title_exact":{"type":"string","index":"not_analyzed"} } },
一,詞條查詢和全文查詢數組
詞條(term)查詢和全文(fulltext)查詢最大的不一樣之處是:全文查詢首先分析(Analyze)查詢字符串,使用默認的分析器分解成一系列的分詞,term1,term2,termN,而後從索引中搜索是否有文檔包含這些分詞中的一個或多個,若是執行的match查詢,默認的操做符(operator)是,只要文檔的字段值可以匹配任意一個詞條,該文檔就匹配查詢條件;而詞條查詢是字符的徹底匹配,只有當字段的字符徹底匹配查詢字符串時,ElasticSearch引擎才斷定文檔匹配查詢條件:app
詞條查詢:詞條查詢不會分析查詢條件,只有當詞條和查詢字符串徹底匹配時,才匹配搜索。當在未被分析的字段中進行搜索時,和查詢字符串徹底匹配的文檔會被返回;若是在已分析(Analyzed)的字段中進行搜索,詞條必須是小寫的單個詞條,不然,匹配不到任何文檔;elasticsearch
全文查詢:ElasticSearch引擎會先分析(analyze)查詢字符串,將其拆分紅小寫的分詞,只要已分析的字段中包含詞條的任意一個,或所有包含,就匹配查詢條件,返回該文檔;若是不包含任意一個分詞,表示沒有任何文檔匹配查詢條件。ide
While the full text queries will analyze the query string before executing, the term-level queries operate on the exact terms that are stored in the inverted index.性能
舉個例子,建立索引,並索引文檔:ui
PUT my_index { "mappings": { "my_type": { "properties": { "full_text": { "type": "string" }, "exact_value": { "type": "string", "index": "not_analyzed" } } } } } PUT my_index/my_type/1 { "full_text": "Quick Foxes!", "exact_value": "Quick Foxes!" }
字段full_text 默認值被分析的(analyzed),字段exact_value顯式設置不被分析,索引文檔的結果是:在倒排索引中,字段full_text包含兩個分詞:quick和foxes,分詞都是小寫的;而exact_value因爲未被分析,只是整個短語「Quick Foxes!」,只能進行徹底匹配,在查詢條件中,少一個字符或多一個字符,甚至大小寫不一樣都不能匹配。spa
1,對未分析的字段進行詞條查詢code
GET my_index/my_type/_search { "query": { "term": { "exact_value": "Quick Foxes!" } } }
對於"exact_value": "Quick Foxes!" ,文檔匹配該查詢條件,若是將查詢條件修改成"exact_value": "Quick Foxes",或"exact_value": "Quick",那麼文檔值不匹配查詢條件,不會返回任何文檔。
2,對已分析(analyzed)的字段進行詞條查詢
GET my_index/my_type/_search { "query": { "term": { "full_text": "Quick Foxes!" } } }
對於查詢條件 "full_text": "Quick Foxes!",不會返回任何文檔,詞條查詢不會分析"Quick Foxes!",對於已分析的字段中,只有小寫的單個詞條,這些分詞都不會匹配含有多個分詞的詞條。修改查詢條件,"full_text": "quick",因爲文檔中包含該分詞,所以文檔匹配查詢條件。
3,對已分析的字段進行全文查詢
GET my_index/my_type/_search { "query": { "match": { "full_text": "Quick Foxes!" } } }
對於全文查詢條件 "full_text": "Quick Foxes!",ElasticSearch引擎首先分析查詢字符串,將其拆分紅兩個小寫的分詞:quick 和 foxes,因爲字段full_text中包含這兩個分詞,所以,文檔匹配匹配(match)查詢。
二,單詞條查詢
對於單個詞條,對eventname字段進行查詢,因爲該字段是被索引和分析(analyzed)的,所以,分詞以後,該字段只包含小寫的分詞。
若是詞條查詢寫成"eventname":"Azure",那麼將匹配不到任何文檔,ElastiSearch引擎返回空的hits數組。
POST /_search -d { "from":10, "size":5, "query":{ "term":{ "eventname":"azure" } } }
三,多詞條(terms)查詢
多詞條(terms)查詢的查詢條件是一個詞條數組,只要文檔匹配任意一個詞條,就匹配查詢條件。
POST /_search -d { "from":10, "size":5, "query":{ "terms":{ "eventname":["azure","aws"] } } }
四,範圍查詢
範圍查詢,是指查詢字段值匹配必定的範圍的文檔:
{ "range" : { "age" : { "gte" : 10, "lte" : 20, "boost" : 2.0 } } }
範圍查詢使用的比較操做符:
五,前綴匹配查詢
前綴匹配查詢是指,文檔的字段包含以指定的字符(不會被分析)爲前綴的分詞,前綴匹配適用於已分析字段,只能匹配單個分詞的前綴;也適用於未被分析的字段,這樣,字符串將從原始值的第一個字符開始前綴匹配,例如:"exact_value": "Qui"
{ "query": { "prefix": { "full_text": "qu" } } }
六,通配符匹配查詢
ElsticSearch支持的通配符(wildcard)有2個,分別是:
在通配符查詢中,ElasticSearch引擎不會分析查詢字符串,當文檔的字段匹配通配符查詢條件時,文檔匹配。通配符查詢會使查詢性能變差,爲了提升查詢性能,推薦:查詢字符串不要以通配符開頭,只在查詢字符串中間或末尾使用通配符。
{ "query": { "wildcard": { "full_text": "qu*k" } } }
七,正則表達式查詢
ElasticSearch引擎支持正則表達式(RegExp)查詢,對詞條進行查詢,這就意味着,在已分析(analyzed)的字符字段上,只能匹配單個分詞的正則表達式,引擎把正則表達式應用到字符串字段的分詞中,而不是應用到字段最原始的文本:
Elasticsearch will apply the regexp to the terms produced by the tokenizer for that field, and not to the original text of the field.
{ "query": { "regexp": { "full_text": "qu[ic]{2}k" } } }
若是想對字符串字段的原始文本執行正則表達式匹配,能夠在不分析(not_analyzed)的字段上執行正則表達式查詢,注意,字符的大小寫。
{ "query": { "regexp": { "exact_value": "Qui.*" } } }
參考文檔:
Elasticsearch Reference [2.4] » Query DSL » Term level queries