ElasticSearch
分布式的搜索引擎和数据分析引擎
应用场景
1.可以处理海量数据
2.elk
优点
1.ES有分片的概念,一个大的索引会被自动分成多个分片来进行存储数据,使用分布式的架构对分片进行并行搜索
缺点
1.ES没有事务的处理
2.相对于MYSQL ES不适用于定位某一个唯一值(如用会员id找会员)时并不需要es
所以在实际项目中一般MYSQL和ES连用,MYSQL数据库应该是基础数据来源并导入ES索引。 如果异常情况发生(节点丢失,中断或误操作 )导致丢失了索引,您将能够完全恢复它。 一般的用法是另外的数据库比如MySQL里面有一份,然后实时同步到ES(通过ElasticSearch-jdbc同步),这样一个用于键值查询(MYSQL),一个用于各种其他查询(ES)
理论
索引(index)
类似MYSQL的数据库
类型(type)
类似MYSQL的表(在es5.0后一个索引下只能建一个类型)
文档(Document)
类似MYSQL的一条记录
分词??
节点(node)
一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力
分片(Shard)
一个索引中的数据保存在多个分片中,相当于水平分表。一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎(所以es的分布式就是体现在分片上的(前提是只有一个节点))。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
ES实际上就是利用分片来实现分布式。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, ES会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。
一个分片可以是主分片或者副本分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。一个副本分片只是一个主分片的拷贝。 副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。
在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。默认情况下,一个索引会有5个主分片,而其副本可以有任意数量。
主分片和副本分片的状态决定了集群的健康状态。每一个节点上都只会保存主分片或者其对应的一个副本分片,相同的副本分片不会存在于同一个节点中。如果集群中只有一个节点,则副本分片将不会被分配,此时集群健康状态为yellow,存在丢失数据的风险。
ES的数据类型
text
当一个字段需要用于全文搜索(会被分词), 比如产品名称、产品描述信息, 就应该使用text类型.
text的内容会被分词, 可以设置是否需要存储: “index”: “true|false”.
text类型的字段不能用于排序, 也很少用于聚合.
PUT website
{
"mappings": {
"blog": {
"properties": {
"summary": {"type": "text", "index": "true"}
}
}
}
}
keyword
当一个字段需要按照精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型.
keyword的内容不会被分词, 可以设置是否需要存储: “index”: “true|false”.
PUT website
{
"mappings": {
"blog": {
"properties": {
"tags": {"type": "keyword", "index": "true"}
}
}
}
}
text和keyword的区别