ES-用於定義文檔字段的核心類型
ES中一個字段可以是核心類型之一,如字符串、數值、日期、布爾型,也可以是一個從核心類型派生的復雜類型,如數組。
字符串類型
索引一類型為字符串的數據
doc1:
FengZhendeMacBook-Pro:bin FengZhen$ curl -XPUT 'localhost:9200/music/album/2' -d '{ > "name":"Late Night with Elasticsearch", > "date":"2019-06-24T22:17" > }'
doc2:
FengZhendeMacBook-Pro:bin FengZhen$ curl -XPUT 'localhost:9200/music/album/3' -d '{ > "name":"latenight", > "date":"2019-06-24T22:20" > }'
在name字符串字段里搜索單詞late
FengZhendeMacBook-Pro:bin FengZhen$ curl -XGET 'localhost:9200/music/album/_search?pretty' -d '{ > "query":{ > "query_string":{ > "query":"late" > } > } > }' { "took" : 11, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.095891505, "hits" : [ { "_index" : "music", "_type" : "album", "_id" : "2", "_score" : 0.095891505, "_source" : { "name" : "Late Night with Elasticsearch", "date" : "2019-06-24T22:17" } } ] } }
索引過程和搜索過程如下
當索引"name":"Late Night with Elasticsearch"時,默認的分析器將所有字符轉化為小寫,然后將字符串分解為單詞。
分析過程中生成了4個詞條,即late、night、with和elasticsearch。查詢的字符串經過同樣的處理過程,”late”生成了同樣的字符串”late”。因為查詢生成的late詞條和文檔生成的late詞條匹配了,所以文檔(doc1)匹配上了搜索。doc2沒有命中的原因是:在索引latenight時,默認的分析器只創建了一個詞條--latenight。
一個詞條是文本中的一個單詞,是搜索的基本單位。在不同的情景下,單詞可以意味着不同的事物,例如,它可以是一個名字,也可以是一個IP地址。如果只想嚴格匹配某個字段,應該將整個字段作為一個單詞來對待。
映射會對這種分析過程起到作用。可以在映射中指定許多分析的選項。例如,可以配置分析,生成原始詞條的同義詞,這樣同義詞的查詢同樣可以匹配。
在設置映射時,有個index選項,可選值有:analyzed(默認)、not_analyzed或no。
將album類型的name字段設置為not_analyzed,映射如下
curl -XPUT 'localhost:9200/music/_mapping/album' -d '{ "album":{ "properties":{ "name":{ "type":"string", "index":"not_analyzed" } } } }'
index類型解釋:
(1) analyzed:默認情況下,index會被設置為analyzed;分析器將所有字段轉為小寫,並將字符串分解為單詞。當期望每個單詞完整匹配時,可以使用此選項
如:期望通過”late”搜出"Late Night with Elasticsearch"
(2) not_analyzed:分析過程被忽略,整個字符串被當做單獨的詞條進行索引。當進行精准的匹配時,可使用此選項
如:期望通過”big data”搜出”big data”,通過”big”搜不出”big data”
(3) no : 如果設置為no,則索引過程會被略過,也沒有詞條產生,因此無法在那個字段上進行搜索。當無需在這個字段上搜索時,這個選項節省了存儲空間,也縮短了索引和搜索的時間。