ElasticSearch+Kibana 索引操作( 附源码)

一 前言

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

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

三 ElasticSearch客户端操作索引

.net 版的客户端 是NEST 语法有相应的官网文档解释很全,也很简单 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 最简单基本的一些操作与概念,大家如果有兴趣可以继续深入了解。

GitHub 源码下载https://github.com/ZeryZhang/ElasticSearchDemo

参考资料: http://www.linuxidc.com/Linux/2015-02/114243.htm

https://www.elastic.co/

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

时间: 2024-10-10 15:38:31

ElasticSearch+Kibana 索引操作( 附源码)的相关文章

opencvbase 实现opencv打开摄像头和初步处理等效果操作(附源码)

// TwoCameraOnTimer2Dlg.cpp : 实现文件 /* CvMat, Mat, IplImage之间的互相转换 IpIImage -> CvMat CvMat matheader; CvMat * mat = cvGetMat(img, &matheader); CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3); cvConvert(img, mat) IplImage -> Mat

使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码和在线测试地址】

项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jQuery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js. jsonp快速入门: [原创]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 关于jquery.ajax的jsonp方法是用以及其error回调函数不能正确执行,请参考园长dudu的文章: jquery ajax中使用jsonp的限制 jQuery插件jQu

Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才是检索结果.首先,电商的搜索引擎并没有爬虫系统,因为所有的数据都是结构化的,一般都是微软的数据库或者 Oracle 的数据库,所以不用像百度一样用「爬虫」去不断去别的网站找内容,当然,电商其实也有自己的「爬虫」系统,一般都是抓取友商的价格,再对自己进行调整. 第二点,就是电商搜索引擎的过滤功能其实比

【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo

开篇先给大家讲段历史故事,博主是湖北襄阳人.襄阳物华天宝,人杰地灵,曾用名襄樊.在2800多年的历史文化中出现了一代名相诸葛亮(卧龙),三国名士庞统(凤雏),魏晋隐士司马徽(水镜先生),唐代大诗人孟浩然(孟襄阳),张继.杜审言,文学家皮日休,北宋著名书画家米芾(米襄阳),“允冠百王”的光武帝刘秀,东方圣人释道安等一大批历史文化名人.小说<三国演义>120回故事中有30多回提到襄阳. 相传诸葛亮的老婆黄月英黄头发黑皮肤,但知识广博.诸葛亮发明木牛流马,就是从黄月英的传授的技巧上发展出来.不仅如此

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1.public Connection getConnection()   获得数据库的连接 2.public boolean updateByPreparedStatement(String sql, List<Object>params)throws SQLException  更新数据库

Android学习笔记(十四)——在运行时添加碎片(附源码)

在运行时添加碎片 点击获取源码 将UI分割为多个可配置的部分是碎片的优势之一,但其真正强大之处在于可在运行时动态地把它们添加到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件中注释掉两个<fragment>元素: 2.在FragmentActivity.java中添加下面的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动添加碎片 FragmentTransaction fr

一步一步搭建Svn+Apache环境(附源码包)

一步一步搭建Svn+Apache环境(附源码包) 看了很多网上的搭建方法,但是因为配置的svn和Apache的版本问题和网上写的教程的不完整等原因,阻碍了很多想要学习的朋友!!今天亲手搭建了一下Svn+Apache环境,并且详细记录了每一步搭建的细节,送给需要的朋友们! 软件版本: redhat6.4(64位) apr-1.5.1.tar.gz apr-util-1.5.3.tar.gz httpd-2.2.27.tar.gz sqlite-amalgamation-3.6.17.tar.gz

HTML5网页录音和压缩,边猜边做..(附源码)

宣传一下自己的qq群:5946699 (暗号:C#交流) 欢迎喜欢C#,热爱C#,正在学习C#,准备学习C#的朋友来这里互相学习交流,共同进步 群刚建,人不多,但是都是真正热爱C#的 我也是热爱C#的 希望大家可以一起交流,共同进步 最近公司需要用到web录音的功能 本人接手了这个任务 在网上找了一些资料 http://www.jsjtt.com/webkaifa/html5/2013-08-28/34.html http://javascript.ruanyifeng.com/bom/webr

从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

原文:从零开始编写自己的C#框架(6)--SubSonic3.0插件介绍(附源码) 前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一次出来,而不是使用复制粘贴),这样对你理解后面的章节会有较好的帮助,如果你对我这种书写方式有什么建议或支持,也希望在评论中留言,谢谢你的支持. SubSonic3.0简介 SubSonic是Rob Conery用c#