Elasticsearch学习笔记
一、Es简单介绍
含义:Elasticsearch是一个可伸缩的开源全文搜索和分析引擎,它使你可以快速且接近实时的去保存,查询和分析海量的数据,他的潜在应用场景是作为一些有复杂搜索功能和需求的应用的搜索引擎。
与关系型数据库的对比:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indexs -> Types -> Documents -> Fields
Elasticsearch集群可以包含多个索引(index)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
二、Es相关词语介绍
cluster
集群是一个或多个节点(服务器)的集合在一起,保存所有的数据,联合所有节点一起提供查询能力。
一个集群有一个唯一的名字,默认是“elasticsearch",集群名很重要,因为集群节点加入集群的唯一方式是根据这个名字。
node
节点的默认名字是漫威的一个角色,默认加入集群elasticsearch
index
索引是一系列具有相似特点文档的集合
实际上,索引只是一个用来指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)
「索引」含义的区分
你可能已经注意到索引(index)这个词在Elasticsearch中有着不同的含义,所以有必要在此做一下区分:
索引(名词) :如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。
索引(动词) :「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
倒排索引 传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。
Type
索引中,类型是一种逻辑的分类,它的意义由使用者来赋予
mapping
每个类型(type)都有自己的映射(mapping)或者结构定义,就像传统数据库表中的列一样。所有类型下的文档被存储在同一个索引下,但是类型的映射(mapping)会告诉Elasticsearch不同的文档如何被索引
Elasticsearch支持以下简单字段类型:
类型 表示的数据类型
String string
Whole number byte, short, integer, long
Floating point float, double
Boolean boolean
Date date
document
文档是搜索信息的基本单元,用json表达,文档必须被包含于一个type中
shards&replicas(主分片&副分片)
分片重要性:
Es中所有数据均衡的存储在集群中各个节点的分片中,会影响ES的性能、安全和稳定性, 所以很有必要了解一下它。
分片是什么?
简单来讲就是咱们在ES中所有数据的文件块,也是数据的最小单元块,整个ES集群的核心就是对所有分片的分布、索引、负载、路由等达到惊人的速度
实列场景:
Es默认设置为5个主分片和1个副分片,也可以根据使用场景自己设置。
假设 IndexA 有2个分片,我们向 IndexA 中插入10条数据 (10个文档),那么这10条数据会尽可能平均的分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。
和主流关系型数据库的表分区的概念有点类似,如果你比较熟悉关系型数据库的话。
es提供能力,让你把index分成好几个部分,叫做分片,当你创建索引的时候,你可以简单的定义分片的个数,每个分片本身是一个独立的功能齐全的“索引”,可以被放到任何的集群节点中
分片的意义:
1.可以水平分割和扩展数据
2.可以把操作分配给多个分区,提高性能
es允许你制作一个或多个分片的副本。叫做复制分片
复制分片的意义:
1、他提供了高可用性,副本和原始分区不处于一个节点中。
2.他提高了性能,因为搜索可以在任何分区上允许。
analysis(分词器和拼音分词)
ik分词器下载链接:https://github.com/medcl/elasticsearch-analysis-ik/releases
拼音分词下载链接:https://github.com/medcl/elasticsearch-analysis-pinyin/releases
安装时对应elasticsearch版本!!!!
全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为Token Filter(词元处理器), 被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。 文本被Tokenizer处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器), 这整个的分析算法被称为Analyzer(分析器)。
Es(默认)分词器和分词器插件:
GET /my_index/_analyze { "text":"中华人民共和国" }
(默认)standard:1中 2华 3人 4民 5共 6和 7国
GET /my_index/_analyze { "text":"中华人民共和国", "analyzer":"ik_smart" }
ik_smart:1中华人名共和国
GET /my_index/_analyze { "text": "中华人民共和国", "analyzer": "ik_max_word" }
ik_max_word:1中华人名共和国 2中华人民 3中华 4华人 5人民共和国 6人民 7共和国 8共和 9国
GET my_index/_analyze { "text":"刘德华", "analyzer": "pinyin" }
pinyin: 1liu 2ldh 3de 4hua
elasticsearch 索引优化:
http://itindex.net/detail/52316-elasticsearch-%E7%B4%A2%E5%BC%95-%E4%BC%98%E5%8C%95
拼音分词下载:
http://itindex.net/detail/52316-elasticsearch-%E7%B4%A2%E5%BC%95-%E4%BC%98%E5%8C%97
ik分词器下载:
http://itindex.net/detail/52316-elasticsearch-%E7%B4%A2%E5%BC%95-%E4%BC%98%E5%8C%96
大神们这些都是个人理解哪里有一样的想法或建议欢迎评论!!!!!!!