一 前言
ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
因为在工作的项目中有使用到所以写下相关的内容,并附带源码 感兴趣的朋友可以自己玩一玩,整个项目都是在Linux上跑的,所以安装步骤都以Linux为主。什么?你不会Linux? 学啊...........
二 安装步骤
2.1 Elasticsearch2.2安装(Yum安装步骤)
下载安装签名
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
配置更新源
在 /etc/yum.repos.d/ 目录下创建.repo 后缀的文件,如elasticsearch.repo,编辑内容如下:
[elasticsearch-2.x]
name=Elasticsearch repository for2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
使用yum命令安装:
yum install elasticsearch
加入启动项:
chkconfig --add elasticsearch
基本配置
编辑文件/etc/elasticsearch/elasticsearch.yml,根据实际情况配置如下节点(也可使用默认)
- cluster.name
- node.name
- index.number_of_shards
- index.number_of_replicas
- network.host
启动Es
运行命令:
Service ElasticSearch start
参考地址:
2.2 Kibana安装
Kibana 可使用它对数据进行高效的搜索、可视化、分析等各种操作
下载解压安装包
下载地址:
配置
编辑文件config/kibana.yml ,配置属性:
- server.host (站点地址)
- elasticsearch.url (指向Elasticsearch 实例)
启动
.bin/kibana
参考地址:
2.3 Marvel安装
Marvel是Elasticsearch的管理和监控工具
安装Marvel代理插件到各个ES节点
在ES目录下运行 bin/plugin 安装插件许可
bin/plugin install license
运行bin/plugin install 安装Marvel代理插件
bin/plugin install marvel-agent
将Marvel插件安装到Kiabana
运行命令:
bin/kibana plugin --install elasticsearch/marvel/latest
重启 Kibana
参考地址:
- https://www.elastic.co/downloads/marvel
- https://www.elastic.co/guide/en/marvel/current/getting-started.html
2.4 Sense安装
一个flask写的elasticsearch查询工具:
支持es查询语言自动提示,es结构自动提示,支持两种主题,支持查询历史记录,支持快捷键。
到Kibana目录运行命令安装 Sense插件
./bin/kibana plugin --install elastic/sense
重新启动 Kibana
参考地址:
2.5 安装Ik分词插件
获取源码
git clone https://github.com/medcl/elasticsearch-analysis-ik.git
编译
去源码根目录下编译
cd elasticsearch-analysis-ik
mvn clean
mvn compile
mvn package
将文件 #{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-*.zip 复制解压到 elasticsearch的目录: plugins/ik
这几个插件安装完成后效果如下
三 ElasticSearch客户端操作索引
http://nest.azurewebsites.net/nest/search/basics.html
示例代码只写了最常用的对索引的一些基本操作 新建, 删除, 添加数据, 局部更新,给索引设别名
1 public class ElasticSearchService
2 {
3 private IElasticClient EsClient;
4 public ElasticSearchService()
5 {
6 EsClient = ElasticSearchConfig.EsClient;
7 }
8
9 /// <summary>
10 /// 创建索引并设置别名
11 /// </summary>
12 /// <returns></returns>
13 public string CreateIndex()
14 {
15 string newIndex = ElasticSearchConfig.IndexName + DateTime.Now.ToString("yyyyMMddHHmm");
16 //创建索引,设置mapping
17 var response = EsClient.CreateIndex(newIndex, c =>
18 c.Mappings(m => m.Map<DoctorEntity>(map => map.AutoMap()))
19 .Settings(setting=>setting.NumberOfShards(3).NumberOfReplicas(1)));//3个分片,1个副本
20 if (!response.Acknowledged)
21 {
22 return "创建索引失败" + response.ServerError.Error.Reason;
23 }
24 //设置别名
25 var aliasResponse = EsClient.Alias(new BulkAliasDescriptor().Add(c => c.Index(newIndex).Alias(ElasticSearchConfig.IndexName)));
26 if (!aliasResponse.Acknowledged)
27 {
28 return "设置索引别名失败" + aliasResponse.ServerError.Error.Reason;
29 }
30
31 return "创建索引并设置别名成功!";
32 }
33
34 /// <summary>
35 /// 移除别名与索引
36 /// </summary>
37 /// <returns></returns>
38 public string DeleteIndex()
39 {
40 //获取别名下的索引
41 var alias = EsClient.CatAliases(a => a.Name(ElasticSearchConfig.IndexName));
42 BulkAliasDescriptor aliasBulk = new BulkAliasDescriptor();
43 var indexNames = new List<string>();
44 foreach (var record in alias.Records)
45 {
46 //移除别名下的索引
47 aliasBulk.Add(new AliasRemoveDescriptor().Index(record.Index).Alias(record.Alias));
48 indexNames.Add(record.Index);
49 }
50 var response = EsClient.Alias(aliasBulk);
51
52 //删除旧索引
53 indexNames.ForEach(index => EsClient.DeleteIndex(new DeleteIndexRequest(index)));
54
55 if (!response.Acknowledged&&alias.Records.Any())
56 {
57 return "索引与别名关系移除失败!" + response.ServerError.Error.Reason;
58 }
59
60 return "索引与别名关系移除成功!";
61 }
62
63 /// <summary>
64 /// 切换索引别名
65 /// </summary>
66 public string ChangeIndexAliase(string newIndexName)
67 {
68 //1 创建新的索引后,将别名指向的索引改为新索引名
69 var alias = EsClient.CatAliases(new CatAliasesRequest(ElasticSearchConfig.IndexName));
70
71 BulkAliasDescriptor aliasDescriptor = new BulkAliasDescriptor();
72
73 foreach (var record in alias.Records)
74 {
75 aliasDescriptor.Add(new AliasRemoveDescriptor().Index(record.Index).Alias(record.Alias));
76 }
77
78 aliasDescriptor.Add(new AliasAddDescriptor().Alias(ElasticSearchConfig.IndexName).Index(newIndexName));
79 var response = EsClient.Alias(aliasDescriptor);
80 if (!response.Acknowledged)
81 {
82 return "切换索引别名失败" + response.ServerError.Error.Reason;
83 }
84
85 return string.Empty;
86 }
87
88 /// <summary>
89 /// 向索引中添加数据
90 /// </summary>
91 /// <param name="doctorEntities"></param>
92 /// <returns></returns>
93 public string AddDoctorInfoToIndex(List<DoctorEntity> doctorEntities)
94 {
95
96 BulkRequest bulk = new BulkRequest(ElasticSearchConfig.IndexName)
97 {
98 Operations = new List<IBulkOperation>()
99 };
100 foreach (var doctorEntity in doctorEntities)
101 {
102 bulk.Operations.Add(new BulkIndexOperation<DoctorEntity>(doctorEntity));
103 }
104
105 var response = EsClient.Bulk(bulk);
106 if (response.Errors)
107 {
108 return "添加索引数据失败" + response.Items.First().Error;
109 }
110
111 return "添加索引数据成功!";
112 }
113
114 /// <summary>
115 /// 更新索引数据
116 /// </summary>
117 public string UpdateDoctorInfoToIndex(List<DoctorEntity> doctorEntities)
118 {
119 var bulk = new BulkRequest(ElasticSearchConfig.IndexName)
120 {
121 Operations = new List<IBulkOperation>()
122 };
123 BulkUpdateDescriptor<DoctorEntity, PartialDoctorEntity> updateDescriptor = new BulkUpdateDescriptor<DoctorEntity, PartialDoctorEntity>();
124
125 foreach (var doctorEntity in doctorEntities)
126 {
127 var updatedescript = updateDescriptor.IdFrom(doctorEntity)//会自动推断出document的id
128 .Doc(PartialDoctorEntity.Generate(doctorEntity))
129 .Upsert(doctorEntity)
130 .RetriesOnConflict(3);
131
132 bulk.Operations.Add(updatedescript);
133 }
134
135 var response = EsClient.Bulk(bulk);
136
137 if (response.Errors)
138 {
139 return "更新索引数据失败" + response.ItemsWithErrors;
140 }
141
142 return "更新索引数据成功!";
143 }
144
145
146 /// <summary>
147 /// 删除索引中数据
148 /// </summary>
149 /// <param name="doctors"></param>
150 /// <returns></returns>
151 public string DeleteDoctorInfoToIndex(List<DoctorEntity> doctors)
152 {
153
154 BulkRequest bulk = new BulkRequest(ElasticSearchConfig.IndexName)
155 {
156 Operations = new List<IBulkOperation>()
157 };
158
159 foreach (var doctor in doctors)
160 {
161 var deleteDescript = new BulkDeleteDescriptor<DoctorEntity>().Document(doctor);
162 bulk.Operations.Add(deleteDescript);
163 }
164
165 var response = EsClient.Bulk(bulk);
166 if (response.Errors)
167 {
168 return "删除索引数据失败" + response.Items.First().Error;
169 }
170
171 return "删除索引数据成功";
172 }
173
174 /// <summary>
175 /// 查询索引数据
176 /// </summary>
177 /// <param name="doctorId"></param>
178 /// <returns></returns>
179 public List<DoctorEntity> QueryDoctors(string doctorId)
180 {
181 SearchDescriptor<DoctorEntity> searchDescriptor =new SearchDescriptor<DoctorEntity>();
182
183 searchDescriptor.Query(q => q.Term(t => t.Field("doctorId").Value(doctorId)));
184
185 var result = EsClient.Search<DoctorEntity>(searchDescriptor);
186
187 return result.Documents.ToList();
188 }
189
190 public List<DoctorEntity> BuiDoctorEntities()
191 {
192 var doctorList = new List<DoctorEntity>();
193 string[] doctorNames = new string[] { "石霖", "陆桂香", "蔡江云", "刘玉凤", "谭志团", "贾雁平", "周琼华", "张平", "周华", "赵子龙" };
194 for (int i = 0; i < 10; i++)
195 {
196 doctorList.Add(new DoctorEntity()
197 {
198 DoctorId = "5588235" + i,
199 DoctorName = doctorNames[i],
200 DoctorNumber = "134" + i,
201 DepartmentNumber = "654",
202 HospitalDepartmentId = Guid.NewGuid().ToString(),
203 HospitalDepartmentName = "内科",
204 HospitalId = Guid.NewGuid().ToString(),
205 HospitalName = "北京大学深圳医院",
206 HospitalNumber = "bjdxszyy",
207 ProfessionalDepartmentId = "225" + i,
208 ProfessionalDepartmentName = "心胸内科",
209 SupplierNumber = "Thirdpart"
210 });
211 }
212
213 return doctorList;
214 }
215
216
217 }
示例代码
四 总结
以上只是对ElasticSearch 最简单基本的一些操作与概念,大家如果有兴趣可以继续深入了解。
参考资料: http://www.linuxidc.com/Linux/2015-02/114243.htm
http://nest.azurewebsites.net/nest/search/basics.html