在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 | 用正则表达式处理字符串 |