一 前言

    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,根据实际情况配置如下节点(也可使用默认)

启动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

参考地址:


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

 

这几个插件安装完成后效果如下

kibana中如何新建一个索引 kibana建立索引_kibana中如何新建一个索引

三 ElasticSearch客户端操作索引

http://nest.azurewebsites.net/nest/search/basics.html

示例代码只写了最常用的对索引的一些基本操作 新建, 删除, 添加数据, 局部更新,给索引设别名 

 




kibana中如何新建一个索引 kibana建立索引_运维_02

kibana中如何新建一个索引 kibana建立索引_运维_03

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

             https://www.elastic.co/

             http://nest.azurewebsites.net/nest/search/basics.html