在Es中,字段的類型很關鍵:html
下面就步入正題吧!git
其中須要說明的是:github
在《ES IN ACTION》中有這樣一段描述:正則表達式
This might be useful when you ask Elasticsearch for a particular field because retrieving a single stored field will be faster than retrieving the entire _source and extracting that field from it, especially when you have large documents. NOTE When you store individual fields as well, you should take into account that the more you store, the bigger your index gets. Usually bigger indices imply slower indexing and slower searching.
意思是,在ES中原始的文本會存儲在_source裏面(除非你關閉了它)。默認狀況下其餘提取出來的字段都不是獨立存儲的,是從_source裏面提取出來的。固然你也能夠獨立的存儲某個字段,只要設置store:true便可。算法
獨立存儲某個字段,在頻繁使用某個特殊字段時很經常使用。並且獲取獨立存儲的字段要比從_source中解析快得多,並且額外你還須要從_source中解析出來這個字段,尤爲是_source特別大的時候。sql
不過須要注意的是,獨立存儲的字段越多,那麼索引就越大;索引越大,索引和檢索的過程就會越慢....app
ElasticSearch 5.0之後,string類型有重大變動,移除了string
類型,string
字段被拆分紅兩種新的數據類型: text
用於全文搜索的,而keyword
用於關鍵詞搜索。elasticsearch
ElasticSearch對字符串擁有兩種徹底不一樣的搜索方式. 你能夠按照整個文本進行匹配, 即關鍵詞搜索(keyword search), 也能夠按單個字符匹配, 即全文搜索(full-text search). 對ElasticSearch稍有了解的人都知道, 前者的字符串被稱爲not-analyzed字符, 然後者被稱做analyzed字符串。ide
Text:會分詞,而後進行索引ui
支持模糊、精確查詢
不支持聚合
keyword:不進行分詞,直接索引
支持模糊、精確查詢
支持聚合
text用於全文搜索的, 而keyword用於關鍵詞搜索.
若是想作相似於sql中的like查詢,可定義爲keyword並使用通配符wildcard方式查詢。
ElasticSearch字符串將默認被同時映射成text
和keyword
類型,將會自動建立下面的動態映射(dynamic mappings):
{ "foo": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } }
基於這個映射你便可以在foo字段上進行全文搜索, 也能夠經過foo.keyword字段實現關鍵詞搜索及數據聚合.
禁用這個特性也很方便: 你只須要在定義mapping時顯式聲明字符串字段的類型或者使用一個動態模板(dynamic template)來匹配你全部的字符串字段便可. 例如經過下面的dynamic template就能夠恢復到在ElasticSearch 2.x中使用的dynamic template的效果:
{ "match_mapping_type": "string", "mapping": { "type": "text" } }
數值類型,注意numeric並非一個類型,它包括多種類型,好比:long,integer,short,byte,double,float,每種的存儲空間都是不同的,通常默認推薦integer和float。官方文檔參考
重要的參數:
日期類型,該類型能夠接受一些常見的日期表達方式,官方文檔參考。
重要的參數:
"date": { "type": "date", "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }
這個類型能夠用來標識IPV4的地址,參考官方文檔
經常使用參數:
布爾類型,全部的類型均可以標識布爾類型,參考官方文檔
重要的參數:
全文搜索引擎會用某種算法對要建索引的文檔進行分析, 從文檔中提取出若干Token(詞元), 這些算法稱爲Tokenizer(分詞器), 這些Token會被進一步處理, 好比轉成小寫等, 這些處理算法被稱爲Token Filter(詞元處理器), 被處理後的結果被稱爲Term(詞), 文檔中包含了幾個這樣的Term被稱爲Frequency(詞頻)。 引擎會創建Term和原文檔的Inverted Index(倒排索引), 這樣就能根據Term很快到找到源文檔了。 文本被Tokenizer處理前可能要作一些預處理, 好比去掉裏面的HTML標記, 這些處理的算法被稱爲Character Filter(字符過濾器), 這整個的分析算法被稱爲Analyzer(分析器)。
ES內置了不少Analyzer, 還有不少第三方的Analyzer插件, 好比一些處理中文的Analyzer(中文分詞)。
analyzer、 tokenizer、 filter能夠在elasticsearch.yml 配置, 下面是配置例子
index : analysis : analyzer : standard : type : standard stopwords : [stop1, stop2] myAnalyzer1 : type : standard stopwords : [stop1, stop2, stop3] max_token_length : 500 # configure a custom analyzer which is # exactly like the default standard analyzer myAnalyzer2 : tokenizer : standard filter : [standard, lowercase, stop] tokenizer : myTokenizer1 : type : standard max_token_length : 900 myTokenizer2 : type : keyword buffer_size : 512 filter : myTokenFilter1 : type : stop stopwords : [stop1, stop2, stop3, stop4] myTokenFilter2 : type : length min : 0 max : 2000
ES內置若干analyzer, 另外還能夠用內置的character filter, tokenizer, token filter組裝一個analyzer(custom analyzer), 好比
index :
analysis :
analyzer :
myAnalyzer :
tokenizer : standard
filter : [standard, lowercase, stop]
若是你要使用第三方的analyzer插件,須要先在配置文件elasticsearch.yml中註冊, 下面是配置IkAnalyzer的例子
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
當一個analyzer在配置文件中被註冊到一個名字(logical name)下後,在mapping定義或者一些API裏就能夠用這個名字來引用該analyzer了,好比
"message": { "type": "string", "indexAnalyzer": "ik", "searchAnalyzer": "ik" }
若是沒有指定索引和搜索用的analyzer,ES會用默認的analyzer來處理,也就是名字(logical name)爲default
, default_index
, default_search
的analyzer。 從名字能夠看出來,default
是索引和搜索時用的默認的analyzer,default_index
是索引時用的默認的analyzer, default_search
是查詢時用的默認analyzer。
下面是在elasticsearch.yml中配置默認analyzer的例子
index:
analysis:
analyzer:
default_index:
tokenizer: standard
filter: [standard, lowercase, my_synonym, my_snow]
default_search:
tokenizer: standard
filter: [standard, lowercase, stop]
或者用這種格式
index.analysis.analyzer.default.type : "mmseg"
一個analyzer能夠起若干別名,好比在下面的例子中,standard analyzer能夠用alias1或者alias2來引用
index :
analysis :
analyzer。 :
standard :
alias: [alias1, alias2]
type : standard
stopwords : [test1, test2, test3]
下面是內置的一些analyzer:
analyzer | logical name | description |
---|---|---|
standard analyzer | standard | standard tokenizer, standard filter, lower case filter, stop filter |
simple analyzer | simple | lower case tokenizer |
stop analyzer | stop | lower case tokenizer, stop filter |
keyword analyzer | keyword | 不分詞,內容總體做爲一個token(not_analyzed) |
pattern analyzer | whitespace | 正則表達式分詞,默認匹配\W+ |
language analyzers | lang | 各類語言 |
snowball analyzer | snowball | standard tokenizer, standard filter, lower case filter, stop filter, snowball filter |
custom analyzer | custom | 一個Tokenizer, 零個或多個Token Filter, 零個或多個Char Filter |
ES內置的tokenizer列表。
tokenizer | logical name | description |
---|---|---|
standard tokenizer | standard | |
edge ngram tokenizer | edgeNGram | |
keyword tokenizer | keyword | 不分詞 |
letter analyzer | letter | 按單詞分 |
lowercase analyzer | lowercase | letter tokenizer, lower case filter |
ngram analyzers | nGram | |
whitespace analyzer | whitespace | 以空格爲分隔符拆分 |
pattern analyzer | pattern | 定義分隔符的正則表達式 |
uax email url analyzer | uax_url_email | 不拆分url和email |
path hierarchy analyzer | path_hierarchy | 處理相似/path/to/somthing 樣式的字符串 |
ES內置的token filter列表。
token filter | logical name | description |
---|---|---|
standard filter | standard | |
ascii folding filter | asciifolding | |
length filter | length | 去掉太長或者過短的 |
lowercase filter | lowercase | 轉成小寫 |
ngram filter | nGram | |
edge ngram filter | edgeNGram | |
porter stem filter | porterStem | 波特詞幹算法 |
shingle filter | shingle | 定義分隔符的正則表達式 |
stop filter | stop | 移除 stop words |
word delimiter filter | word_delimiter | 將一個單詞再拆成子分詞 |
stemmer token filter | stemmer | |
stemmer override filter | stemmer_override | |
keyword marker filter | keyword_marker | |
keyword repeat filter | keyword_repeat | |
kstem filter | kstem | |
snowball filter | snowball | |
phonetic filter | phonetic | 插件 |
synonym filter | synonyms | 處理同義詞 |
compound word filter | dictionary_decompounder, hyphenation_decompounder | 分解複合詞 |
reverse filter | reverse | 反轉字符串 |
elision filter | elision | 去掉縮略語 |
truncate filter | truncate | 截斷字符串 |
unique filter | unique | |
pattern capture filter | pattern_capture | |
pattern replace filte | pattern_replace | 用正則表達式替換 |
trim filter | trim | 去掉空格 |
limit token count filter | limit | 限制token數量 |
hunspell filter | hunspell | 拼寫檢查 |
common grams filter | common_grams | |
normalization filter | arabic_normalization, persian_normalization |
ES內置的character filter列表
character filter | logical name | description |
---|---|---|
mapping char filter | mapping | 根據配置的映射關係替換字符 |
html strip char filter | html_strip | 去掉HTML元素 |
pattern replace char filter | pattern_replace | 用正則表達式處理字符串 |