Beats,Logstash负责数据收集与处理。至关于ETL(Extract Transform Load)。
Elasticsearch负责数据存储、查询、分析。
Kibana负责数据探索与可视化分析。css
一、Elasticsearch的常见术语。注意:Elasticsearch6.x版本之后概念发生了变化。
html
二、索引Index:由具备相同字段的文档列表组成。索引Index是文档的集合。至关于数据库中的数据表。python
Elasticsearch 6.x版本之后,一个索引Index下面最多只能建一个Type或者将来没有Type了。索引中存储具备相同结构的文档(Document)。至关于数据表,数据表中有schema的概念,数据表有本身的表结构的定义。而Index的mapping至关于数据表的schema的概念,Index也须要定义字段名称和类型的。正则表达式
每一个索引都有本身的mapping定义,用于定义字段名和类型。一个集群能够有多个索引。数据库
三、文档Document:用户存储在es中的数据文档。es中存储的最小单元。至关于数据库中的一行数据。每一个文档都有惟一的id标识,能够自行指定或者es自动生成。json
Json Object,由字段Field组成,常见数据类型以下:
字符串:text(分词)、keyword(不分词)。
数值型:long、integer、short、byte、double、float、half_float、scaled_float。
布尔型:boolean。
日期:data。
二进制:binary。
范围类型:interger_range、float_range、long_range、double_range、date_range。api
四、Document MetaData。元数据,用于标注文档的相关信息。数组
_index:文档所在的索引名称。
_type:文档所在的类型名称。
_id:文档惟一的id。
_uid:组合id,由_type和_id组成(6.x_type再也不起做用,同_id同样)。
_source:文档的原始Json数据,能够从这里获取每一个字段的内容。
_all:整合全部字段内容到该字段,默认禁用。网络
五、节点Node:一个Elasticsearch的运行实例,是集群的构成单元。app
六、集群Cluster:由一个或者多个节点组成,对外提供服务。
七、Elasticsseach提供的Rest api。
Elasticsseach集群对外提供的RESTFul API,REST是REpresentational State Transfer的缩写。
URI指定资源,如Index、Document等等。
Http Method,指明资源操做类型,如GET、POST、PUT、DELETE等等。
Rest API经常使用的两种交互方式:Curl命令行、Kibana DecTools。
ElasticSearch有专门的Index API,用于建立(PUT)、查看(GET)、更新(Post)、删除(Delete)索引配置等等。
八、Elasticsseach提供的Rest api使用。
建立文档,指定id建立文档的api。建立文档的时候,若是索引不存在,es会自动建立对应的index和type。
PUT /index/type/id{ "username":"zhangsan", "age":24 }
查询文档,指定要查询的文档id。_source存储了文档的完整原始数据。
get /index/type/id
查询文档,搜索全部文档,用到_search,查询语句json格式,放到http body中发送到es,以下所示:
get /index/type/_search 返回_id为1的文档。 get /index/type/_search{ "query":{ "term":{ "_id":"1" } } }
response结果,参数解释以下所示:
1 response结果,参数解释以下所示: 2 { 3 "took" : 2, # took是查询耗时,单位是ms。 4 "timed_out" : false, 5 "_shards" : { 6 "total" : 5, 7 "successful" : 5, 8 "skipped" : 0, 9 "failed" : 0 10 }, 11 "hits" : { # hits是命中的结果集。 12 "total" : 1, # total是符合条件的总文档数。 13 "max_score" : 0.2876821, 14 "hits" : [ # hits是返回的文档详情数据数组,默认前10个文档。 15 { 16 "_index" : "test_index", # _index是索引名称。 17 "_type" : "doc", 18 "_id" : "1", # _id是文档的id。 19 "_score" : 0.2876821, # _score是文档的得分。 20 "_source" : { # _source是文档的详情。 21 "username" : "wangwu", 22 "age" : 24 23 } 24 } 25 ] 26 } 27 }
批量建立文档API,es容许一次建立多个文档,从而减小网络传输开销,提高写入速率。endponit为_bulk,即url最后是_bulk,http method是post请求,以下所示:
action_type包含,index(若是存在则覆盖)、update、create(若是存在则报错)、delete这几种类型。
es容许一次查询多个文档,endpoint为_mget,以下所示:
九、Elasticsearch的倒排索引与分词。举例,书的目录页与索引页,目录页对应正排索引,索引页对应倒排索引。es存储的是一个json格式的文档,其中包含多个字段,每一个字段会有本身的倒排索引。
a、正排索引就是文档Id到文档内容,单词的关联关系。倒排索引,就是单词到文档Id的关联关系。
b、倒排索引是搜索引擎的核心,主要包含两个部分。单词词典(Term Dictionary),倒排列表(Posting List),Posting是倒排索引项。
c、单词词典(Term Dictionary)是倒排索引的重要组成。
一是记录全部文档的单词,通常都比较大,
二是记录单词到倒排列表的关联信息,记录了单词关联了那些文档,记录一下关联信息,就能够找到关联的文档的id,经过关联id找到真正的文档信息。
d、倒排索引中的倒排列表。
倒排列表(Posting List)记录了单词对应的文档集合,由倒排索引项(Psoting)组成。
倒排索引项(Posting)主要包含以下信息:
文档Id,用于获取原始信息。
单词频率(TF,Term Frequency),记录该单词在该文档中的出现次数,用于后续相关性算分。
位置(Position),记录单词在文档中的分词位置(多个),用于作此语搜索(Phrase Query)。
偏移(Offset),记录单词在文档的开始和结束位置,用于作高亮显示。
十、分词,是指将文本转换成一系列单词(term or token)的过程,也能够叫作文本分词,在es里面称为Analysis,以下所示:
分词器,负责进行分词,分词器是es中专门处理分词的组件,英文名称为Analyzer。分词器的调用顺序,Character Filters ->Tokenizer ->Token Filter,它的组成以下所示:
Character Filters,针对原始文本进行处理,好比去除html特殊标记符。
Tokenizer,将原始文本按照必定规则切分为单词。
Token Filter,针对Tokenizer处理的单词就行再加工,好比转小写,删除或者新增等等处理。
十一、Analyzer api,es提供了一个测试分词的api接口,方便验证分词效果,endpoint是_analyze。
a、能够直接指定analyzer进行测试。
b、能够直接指定索引中的字段进行测试。
c、能够自定义分词器进行测试。
十二、Elasticsearch自带分词器,包含Standard、Simple、Whitespace、Stop、Keyword、Pattern、Language,以下所示:
a、Standard Analyzer,默认分词器,特性为:a、按照切分,支持多语言,b、小写处理。
包含Tokenizer(Standard)和Token Filters(Standard -> Lower case -> Stop[disabled by default])。
b、Simple Analyzer,特性为:a、按照非字母进行切分,b、小写处理。
包含Tokenizer(Lower Case)。
c、Whitespace Analyzer,特性为:a、按照空格进行切分。
包含Tokenizer(Whitespace)。
d、Stop Analyzer,Stop word指语气助词等修饰性的此语,好比the、an、的、这等等。特性为,a、相比Simple Analyzer多了Stop word处理。
包含Tokenizer(Lower Case),Token Filters(Stop)。
e、Keyword Analyzer,特性为,a、不分词,直接将输入做为一个单词输出。
包含Tokenizer(Keyword)。
f、 Pattern Analyzer,特性为,a、经过正则表达式自定义分隔符。b、默认是\W+,即非字词的符号做为分隔符。
包含Tokenizer(Pattern),Token Filters(Lower case -> Stop[disabled by default])。
g、Language Analyzer,提供了30+常见语言的分词器。
arabic、armenian、basque、bengali、brazilian、bulgarian、catalan、cjk、czech、danish、dutch、english。
1三、中文分词,指的是将一个汉字序列切分红一个一个单独的词。在英文中,单词之间是以空格做为天然分界符,汉语中词没有一个形式上的分界符。
经常使用中文分词系统。
IK中文分词器。
a、实现中英文单词的切分,支持ik_smart,ik_maxword等模式。
b、能够自定义词库,支持热更新分词词典。
jieba中文分词器。
a、python中最流行的分词系统,支持分词和词性标注。
b、支持繁体分词,自定义分词,并行分词等等。
1四、自定义分词,当自带的分词没法知足需求时候,能够自定义分词。经过自定义Character Filters、Tokenizer和Token Filter实现。
1)、Character Filters。
a、在Tokenizer以前对原始文本进行处理,好比增长、删除或者替换字符等等。
b、自带的以下所示:
Html Strip去除html标签和转换html实体。
Mapping进行字符替换操做。
Pattern Replace进行正则匹配替换。
c、会影响后续Tokenizer解析的postion和offset的信息。
2)、Tokenizer。
a、将原始文本按照必定规则切分为单词(term or token)。
b、自带的以下所示:
standard按照单词进行分割。
letter按照非字符类进行分割。
whitespace按照空格进行分割。
UAX URL Email按照standard分割,但不会分割邮箱和url。
NGram和Edge NGram连词分割。
Path Hierarchy按照文件路径进行切割。
3)、Token Filter。
a、对于Tokenizer输出的单词(term)进行增长、删除、修改等等操做。
b、自带的以下所示:
lowercase将全部term转换为小写。
stop删除stop words。
NGram和Edge NGram连词分割。
Synonym添加近义词的term。
1五、分词使用说明,索引时分词和查询时候分词的选择。
分词使用说明,索引时分词和查询时候分词的选择。
1)、分词会在以下两个时机使用:
a、建立或者更新文档的时候(Index Time),会对相应的文档进行分词处理。
b、查询的时候(Search Time),会对查询语句进行分词。
2)、索引时分词,是经过配置Index Mapping中每一个字段的analyzer属性实现的,不指定分词的时候,默认使用standard分词器。
3)、查询时分词的指定方式有以下几种。
a、查询的时候经过analyzer指定分词器。
b、经过index mapping设置search_analyzer实现,这个时候能够设置查询时分词,同事设置查询时分词。
4)、通常状况下,不须要特定指定查询时分词器,直接使用索引时分词器便可,不然会出现没法匹配的状况。
5)、分词的使用建议。
a、明确字段是否须要分词,不须要分词的字段就将type设置为keyword,能够节省空间和提升写性能。
b、善用_analyze_api,查看文档具体分词结果。
c、多动手测试,查看文档具体的分词结果。
1六、Elasticsearch Mapping设置。相似数据库中的表结构定义,主要做用以下所示:
a、定义Index下的字段名(Field Name)。
b、定义字段的类型,好比数据型,字符串型,布尔型等等。
c、定义倒排索引相关的配置,好比是否索引,记录position等等。
如何获取到一个索引Index的mapping呢,以下所示:
如何自定义mapping呢,自定义mapping的api,以下所示:
自定义Mapping注意事项。
1)、Mapping中的字段类型一旦设定之后,禁止直接修改,缘由如是所示,Lucene实现的倒排索引生成后不容许进行修改。
若是要进行修改字段类型的话,从新创建新的索引,而后作reindex操做。
2)、容许新增字段,经过dynamic参数来控制字段的新增。由于新增字段,类型不定,对于es来讲,只是新增了一个倒排索引。dynamic参数是和properties一个级别的参数配置。
a、true(默认),容许自动新增字段。
b、false,不容许自动新增字段,可是文档能够正常写入,但没法对字段进行查询等操做。
c、strict文档不能写入,报错。
3)、copy_to参数,将该字段的值复制到目标字段,实现相似_all的做用,不会出如今_source中,只用来搜索使用。copy_to参数和type一个级别的参数。
4)、index参数,控制当前字段是否索引,默认为true,即记录索引,false不记录,即不能够搜索。index参数和type一个级别的参数。若是不但愿被查询便可设置为false。
5)、index_options用于控制倒排索引记录的内容,有以下4种配置。index_options参数和type一个级别的参数。
a、docs只记录doc id。
b、freqs记录doc id和term frequencies。
c、positions记录doc id、term frequencies和term position。
d、offsets记录doc id、term frequencies、term position和character offsets。
e、text类型默认配置为positions,其余默认配置为docs。记录内容越多,占用空间越大。
6)、null_value,当字段遇到null值得时候得处理策略,默认为null,即空值,此时es会忽略该值,能够经过设定该值设定字段的默认值。null_value参数和type一个级别的参数。
更多参数详见官网文档便可。
1七、Elasticsearch的数据类型。
1)、核心的数据类型(字段field对应的类型type)。
a、字符串类型text(分词的)、keyword(不分词的)。
b、数值型:long、integer、short、byte、double、float、half_float、scaled_float。
c、布尔型:boolean。
d、日期:data。
e、二进制:binary。
f、范围类型:interger_range、float_range、long_range、double_range、date_range。
2)、复杂数据类型。
a、数组类型array。
b、对象类型object。
c、嵌套类型nested object。
3)、地理位置数据类型。
a、geo_point。
b、geo_shape。
4)、专用类型。
a、记录ip地址ip。
b、实现自动补全completion。
c、记录分词数token_count。
d、记录字符串hash值murmur3。
e、percolator。
f、join。
5)、多字段特性multi_fields。
容许对同一个字段采用不一样得配置,好比分词,常见例子如对人名实现拼音搜索。只须要在人名种新增一个子字段为pinyin便可。
1八、Dynamic Mapping,es能够自动识别文档字段类型,从而下降用户使用成本,以下所示。
es是依靠json文档的字段类型来实现自动识别字段类型,支持的类型以下所示:
1九、dynamic日期与数字识别。
1)、日期的自动识别能够自行配置日期格式,以知足各类需求。
a、默认是["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z || yyyy/MM/dd Z"]
b、strict_date_optional_time是ISO datetime的格式,完整格式相似下面所示:
YYYY-MM-DDThh:mm:ssTZD。例如,1994-07-12T19:20:30+01:00
c、dynamic_date_formats能够自定义日期类型。该参数是在type参数下一级的参数。
d、date_detection能够关闭日期自动识别的机制。该参数是在type参数下一级的参数。
2)、字符串是数字的时候,默认不会自动识别为整数,由于字符串中出现数字是彻底合理的。
a、numeric_detection能够开启字符串中数字的自动识别。该参数是在type参数下一级的参数。
20、dynamic-template(动态模板)简介。
1)、容许根据es自动识别的数据类型、字段名等来动态设定字段类型,能够实现以下效果。
a、全部字符串类型都设定为keyword类型,即默认不分词的。
b、全部以message开头的字段都设定为text类型,即分词。
c、全部以long_开头的字段都设定为long类型。
d、全部自动匹配为double类型都设定为float类型,以节省空间。
2)、匹配规则通常有以下几个参数。
a、match_mapping_type匹配es自动识别的字段类型,如boolean、long、string等等。
b、match,unmatch匹配字段名。
c、path_match,path_unmatch匹配路径。
3)、字符串默认使用keyword类型。es默认会为字符串设置为text类型,并增长一个keyword的子字段。
字符串默认使用keyword类型。es默认会为字符串设置为text类型,并增长一个keyword的子字段。
动态模板映射之后是这样的。
以message开头的字段都设置为text类型。 dynamic_templates,数组,能够指定多个匹配规则。能够设定多个模板,执行顺序,从上到下的。
2一、自定义mapping的建议。
自定义mapping的操做步骤以下所示。
a、写一条文档到es的临时索引中,获取es自动生成的mapping。
b、修改步骤a获得的mapping,自定义相关配置。
c、使用步骤b的mapping建立实际所需索引。
最方便的是根据动态模板进行建立。
2二、索引模板。
a、索引模板,英文为Index Template,主要用于在新建索引的时候自动应用预先设定的配置。简化索引建立的操做步骤。
能够设定索引的配置和mapping。
能够有多个模板,根据order设置,order大的覆盖小的配置。
做者:别先生
博客园:https://www.cnblogs.com/biehongli/
若是您想及时获得我的撰写文章以及著做的消息推送,能够扫描上方二维码,关注我的公众号哦。