前言:ES和Solr
- Solr 建立索引的时候搜索能力明显下降,实时搜索能力不高,ES实时搜索能力更强
- Solr 需要通过ZooKeeper进行分布式,ES自己可以做分布式
- Solr 支持多种数据格式,如JSON、XML、CSV,而ES只支持JSON
- Solr 官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供
- Solr在传统的搜索应用中表现好于Elasticsearch,但在处理实时搜索应用时效率明显低于Elasticsearch
- Solr是传统搜索应用的有力解决方案,但Elasticsearch更适用于新兴的实时搜索应用
1.Docker安装ES
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2
2.ES配置IK分词器和拼音分词器
1.进入容器
docker exec -it es /bin/bash
2.下载IK分词器插件(注:看好版本号)
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip
3.下载拼音分词器插件(注:看好版本号)
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v6.3.2/elasticsearch-analysis-pinyin-6.3.2.zip
3.安装Kibana(注:Kibana的版本一定和ES的版本一致的)
docker run -d --link es:elasticsearch -p 5601:5601 docker.elastic.co/kibana/kibana:6.3.2
4.ES基础查询语法的使用
中文文档地址:https://es.xiaoleilu.com/010_Intro/05_What_is_it.html
各种基础API查询,基于restful风格,可以参考一下官方网站的查询方式,自己手动操作一下。
5.扩容方式
难点在于如何计算单台机器的承载容量,想必都应该听说过,在集群承载到一定量级时,查询速度会变慢,原因就在于无法将所有的数据都在加载到内存上面,有部分数据要存储在硬盘上,这样查询的时候就会出现多次从磁盘读取到内存中,这样多次IO就造成查询速度过慢,一般的面试题都会问,如果你用过ES,如果处理大容量数据查询慢的问题,这个问题的主旨在于第一,你有没有生产环境的经验,第二,你有没有考虑过设计的问题。当然,大多数人包括我在内,可能都没有大型实战项目的经验,所以,我们了解一下ES的存储原理,可以大概的计算一下单台机器能存储多少数据,ES在建立数据点的时候都应该经历过,primary shard和replica shard, shard是ES最小的存储单元,可以理解为单位,primary 是主存储,而replica 是副本,也就是备份,和primary存储一样的数据,但是replica 可以承载一定量的读取路由。所以,相当于你总机器的一半容量需要存储副本,所以计算的时候只能计算一半的容量,假如有三台机器,内存均是32G内存,总容量也就是32*3,可用容量也就是32*3/2,当然,一半的容量也不能全部存储慢,要留有一定的冗余内存,假设只有80%,可用容量也就是32*3/2*0.8。ok,现在可用容量已经计算完成,我们在存储document时,可以查询一下单条数据所占用的大小,如果是10kb的话,那么可以存储数据的容量已经显而易见。
所以在设计初期我们已经可以计算出我们需要的机器以及内存,当然扩容的事情还没有说,扩容的话,一般就是水平添加机器,ES内部已经自动做了负载均衡,所以我们只需要在把node节点添加到集群中,然后添加一下replica shard的数量。
"number_of_shards": "5",
"number_of_replicas": "1",
6.如何设计index(TODO)
Tips:ES6已经开始不推荐使用Type 而 ES7中已经取消了Type
7.SpringBoot中使用ES
1.创建Maven项目
2.导入必要依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>