term是表明徹底匹配,也就是精確查詢,搜索前不會再對搜索詞進行分詞,因此咱們的搜索詞必須是文檔分詞集合中的一個。好比說咱們要查找年齡爲39的全部文檔html
POST /bank/_search?pretty { "query": { "term": { "age": "39" } } }
結果:app
另外再查詢address=Avenue的文檔,沒有查到結果elasticsearch
爲何?ide
字符串字段能夠是文本類型(視爲全文,如電子郵件正文)或關鍵字(視爲精確值,如電子郵件地址或郵政編碼)。精確值(如數字,日期和關鍵字)具備在添加到倒排索引的字段中指定的確切值,以使其可被搜索。測試
可是,分析文本字段。這意味着它們的值首先經過一個分析器產生一個項目列表,而後將其添加到倒排索引中。ui
分析文本的方法有不少種:默認的標準分析器會刪除大部分的標點符號,將文本分解爲單個的單詞,並將其分解爲小寫字母。例如,標準分析儀會將字符串「Quick Brown Fox!」變成[quick,brown,fox]。編碼
先看Avenue的分析spa
由於171 Putnam Avenue被分解爲 171,putnam,avenue三個詞,所以在Avenue時沒法查詢到,由於第一個字符是大寫code
下面作一個測試演示htm
首先,建立一個索引,指定字段映射,並索引一個文檔
建立索引和索引數據
PUT my_index { "mappings": { "my_type": { "properties": { "full_text": { "type": "text" 1 }, "exact_value": { "type": "keyword" 2 } } } } } PUT my_index/my_type/1 { "full_text": "Quick Foxes!", 3 "exact_value": "Quick Foxes!" 4 }
一、full_text字段是文本類型,將被分析。
二、exact_value字段是關鍵字類型,不會被分析。
三、full_text倒排索引將包含術語:[quick,foxes]。
四、exact_value倒排索引將包含確切的術語:[Quick Foxes!]
如今,比較術語查詢和匹配查詢的結果:
GET my_index/my_type/_search { "query": { "term": { "exact_value": "Quick Foxes!" 1 } } } GET my_index/my_type/_search { "query": { "term": { "full_text": "Quick Foxes!" 2 } } } GET my_index/my_type/_search 3 { "query": { "term": { "full_text": "foxes" } } } GET my_index/my_type/_search 4 { "query": { "match": { "full_text": "Quick Foxes!" } } }
一、此查詢匹配,由於exact_value字段包含確切的術語Quick Foxes !.
二、這個查詢不匹配,由於full_text字段只包含quick和foxes這兩個詞。 它不包含確切的術語Quick Foxes !.
三、術語foxes的查詢匹配full_text字段。
四、full_text字段上的匹配查詢首先分析查詢字符串,而後查找包含快速或狐狸或二者的文檔。
再看看分析
GET /my_index/_analyze { "field": "exact_value", "text": "Quick Foxes!" } 結果: { "tokens": [ { "token": "Quick Foxes!", "start_offset": 0, "end_offset": 12, "type": "word", "position": 0 } ] }
GET /my_index/_analyze { "field": "full_text", "text": "Quick Foxes!" } 結果: { "tokens": [ { "token": "quick", "start_offset": 0, "end_offset": 5, "type": "<ALPHANUM>", "position": 0 }, { "token": "foxes", "start_offset": 6, "end_offset": 11, "type": "<ALPHANUM>", "position": 1 } ] }