分布式存储和搜索海量数据从来都不是一件容易的事,面对着每天生产的海量数据,你把它放在文件,数据库?一台机器存储不下该如何?ElasticSearch应用而生,基于lucene,支持分布式存储,支持TB级数据存储,支持上百台服务器分布式部署,支持数据冗余,快速检索,下文给出ElasticSearch的部署与开发步骤;
版本信息
安装与集群配置
拷贝elasticsearch-6.3.1.tar.gz文件到某目录下并解压,如 /home/es/elasticsearch-6.3.1
;
创建用户与用户组:
groupadd es
useradd es -g es
chown -R es:es /home/es/elasticsearch-6.3.1
创建es的数据目录和日志目录;
修改配置文件config/elasticsearch.yml
如下:
1cluster.name: YOURCLUSTERNAME
2node.name= YOURNODENAME
3path.data: /home/es/data
4path.logs: /home/es/logs
5network.host: 192.168.1.230
6http.port: 9200
7http.cors.enabled: true
8http.cors.allow-origin: "*"
9#其他包括该集群的服务器地址
10discovery.zen.ping.unicast.hosts: ["192.168.1.x", "192.168.1.y"]
11discovery.zen.minimum_master_nodes: 2
12#Centos6不支持SecComp屏蔽memory_lock
13bootstrap.memory_lock: false
14bootstrap.system_call_filter: false
15#CentOS6,es6.3.1版本加入
16action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*
17xpack.security.enabled: false
18xpack.monitoring.enabled: true
19xpack.graph.enabled: false
20xpack.watcher.enabled: false
21xpack.ml.enabled: false
1vi /etc/security/limits.conf
2* soft nofile 65536
3* hard nofile 131072
4vi /etc/sysctl.conf
5vm.max_map_count=655360
6sysctl -p
特别注意:使用SpringBoot2的不能使用ElasticSearch 5.x.x
版,会报无法发现node错误
es开发:maven依赖
1<dependency>
2 <groupId>org.springframework.bootgroupId>
3 <artifactId>spring-boot-starter-data-elasticsearchartifactId>
4dependency>
es开发:配置
application.yml
中引入:
1spring:
2 data:
3 elasticsearch:
4 cluster-name: es-cluster
5 cluster-nodes: 192.168.1.63:9300,192.168.1.64:9300
6 repositories.enable: true
es开发
可以使用JPA
或注入ElasticsearchTemplate
对ES
做增删改查
1//Controller
2//ElasticsearchTemplate方式
3@Autowired
4private ElasticsearchTemplate elasticsearchTemplate;
5//JPA方式
6@Autowired
7private ArticleRepository articleRepository;
8
9@RequestMapping("/query")
10 public Object singleTitle(String word) {
11 SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new QueryStringQueryBuilder(word)).build();
12 return elasticsearchTemplate.queryForList(searchQuery, ESArticle.class);
13 }
14
15 @RequestMapping("/add")
16 public Object addArticle(ESArticle article) {
17 article.setWeight(1);
18 article.setCreateTime(new Date());
19 articleRepository.save(article);
20 return article;
21 }
22
23 @RequestMapping("/remove")
24 public Map removeArticle(String id) {
25 Map retMap = new HashMap();
26 retMap.put("ret", false);
27 try {
28 articleRepository.deleteById(id);
29 retMap.put("ret", true);
30 }catch(Exception ex) {
31 ex.printStackTrace();
32 }
33 return retMap;
34 }
35
36 @RequestMapping("/update")
37 public Map updateArticle(String id,String title) {
38 Map retMap = new HashMap();
39 retMap.put("ret", false);
40 try {
41 Optional artile = articleRepository.findById(id);
42 if(artile.isPresent()) {
43 artile.get().setTitle(title);
44 articleRepository.save(artile.get());
45 }
46 retMap.put("ret", true);
47 }catch(Exception ex) {
48 ex.printStackTrace();
49 }
50 return retMap;
51 }
52
53//JPA,定义实体类
54@Document(indexName="article",type="post",indexStoreType="fs",shards=5,replicas=2,refreshInterval="-1")
55public class ESArticle {
56 @Id
57 private String id;
58 private String title;
59 @Field(type=FieldType.Text,searchAnalyzer="ik",analyzer="ik")
60 private String content;
61 private Date createTime;
62
63 @Field(type=FieldType.Integer,index=false)
64 private int weight;
65 public String getId() {
66 return id;
67 }
68 public void setId(String id) {
69 this.id = id;
70 }
71 public String getTitle() {
72 return title;
73 }
74 public void setTitle(String title) {
75 this.title = title;
76 }
77 public String getContent() {
78 return content;
79 }
80 public void setContent(String content) {
81 this.content = content;
82 }
83 public Date getCreateTime() {
84 return createTime;
85 }
86 public void setCreateTime(Date createTime) {
87 this.createTime = createTime;
88 }
89 public int getWeight() {
90 return weight;
91 }
92 public void setWeight(int weight) {
93 this.weight = weight;
94 }
95 @Override
96 public String toString() {
97 return "ESArticle [id=" + id + ", title=" + title + ", cOntent=" + content + ", createTime=" + createTime
98 + ", weight=" + weight + "]";
99 }
100}
101//JPA定义Repository
102public interface ArticleRepository extends ElasticsearchRepository<ESArticle, String>{
103
104}
我们的应用场景