ElasticSearch java API - 聚合查询

以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置。
index的mapping为:
"mappings": {
"player": {
"properties": {
"name": {
"index": "not_analyzed",
"type": "string"
},
"age": {
"type": "integer"
},
"salary": {
"type": "integer"
},
"team": {
"index": "not_analyzed",
"type": "string"
},
"position": {
"index": "not_analyzed",
"type": "string"
}
},
"_all": {
"enabled": false
}
}
}

索引中的全部数据:

微信截图_20160920171030.png

 
首先,初始化Builder:
SearchRequestBuilder sbuilder = client.prepareSearch("player").setTypes("player");
接下来举例说明各种聚合操作的实现方法,因为在es的api中,多字段上的聚合操作需要用到子聚合(subAggregation),初学者可能找不到方法(网上资料比较少,笔者在这个问题上折腾了两天,最后度了源码才彻底搞清楚T_T),后边会特意说明多字段聚合的实现方法。另外,聚合后的排序也会单独说明。
  • group by/count

例如要计算每个球队的球员数,如果使用SQL语句,应表达如下:
select team, count(*) as player_count from player group by team;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
sbuilder.addAggregation(teamAgg);
SearchResponse response = sbuilder.execute().actionGet();
 
  • group by多个field

例如要计算每个球队每个位置的球员数,如果使用SQL语句,应表达如下:
select team, position, count(*) as pos_count from player group by team, position;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
TermsBuilder posAgg= AggregationBuilders.terms("pos_count").field("position");
sbuilder.addAggregation(teamAgg.subAggregation(posAgg));
SearchResponse response = sbuilder.execute().actionGet();
 
  • max/min/sum/avg

例如要计算每个球队年龄最大/最小/总/平均的球员年龄,如果使用SQL语句,应表达如下:
select team, max(age) as max_age from player group by team;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
MaxBuilder ageAgg= AggregationBuilders.max("max_age").field("age");
sbuilder.addAggregation(teamAgg.subAggregation(ageAgg));
SearchResponse response = sbuilder.execute().actionGet();

  • 对多个field求max/min/sum/avg

例如要计算每个球队球员的平均年龄,同时又要计算总年薪,如果使用SQL语句,应表达如下:
select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("team");
AvgBuilder ageAgg= AggregationBuilders.avg("avg_age").field("age");
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(ageAgg).subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
 
  • 聚合后对Aggregation结果排序

例如要计算每个球队总年薪,并按照总年薪倒序排列,如果使用SQL语句,应表达如下:
select team, sum(salary) as total_salary from player group by team order by total_salary desc;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("team").order(Order.aggregation("total_salary ", false);
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
需要特别注意的是,排序是在TermAggregation处执行的,Order.aggregation函数的第一个参数是aggregation的名字,第二个参数是boolean型,true表示正序,false表示倒序。 
  • Aggregation结果条数的问题

默认情况下,search执行后,仅返回10条聚合结果,如果想反悔更多的结果,需要在构建TermsBuilder 时指定size:
TermsBuilder teamAgg= AggregationBuilders.terms("team").size(15);
 
  • Aggregation结果的解析/输出

得到response后:
Map<String, Aggregation> aggMap = response.getAggregations().asMap();
StringTerms teamAgg= (StringTerms) aggMap.get("keywordAgg");
Iterator<Bucket> teamBucketIt = teamAgg.getBuckets().iterator();
while (teamBucketIt .hasNext()) {
Bucket buck = teamBucketIt .next();
//球队名
String team = buck.getKey();
//记录数
long count = buck.getDocCount();
//得到所有子聚合
Map subaggmap = buck.getAggregations().asMap();
//avg值获取方法
double avg_age= ((InternalAvg) subaggmap.get("avg_age")).getValue();
//sum值获取方法
double total_salary = ((InternalSum) subaggmap.get("total_salary")).getValue();
//...
//max/min以此类推
}
 
  • 总结

综上,聚合操作主要是调用了SearchRequestBuilder的addAggregation方法,通常是传入一个TermsBuilder,子聚合调用TermsBuilder的subAggregation方法,可以添加的子聚合有TermsBuilder、SumBuilder、AvgBuilder、MaxBuilder、MinBuilder等常见的聚合操作。
 
从实现上来讲,SearchRequestBuilder在内部保持了一个私有的 SearchSourceBuilder实例, SearchSourceBuilder内部包含一个List<AbstractAggregationBuilder>,每次调用addAggregation时会调用 SearchSourceBuilder实例,添加一个AggregationBuilder。
同样的,TermsBuilder也在内部保持了一个List<AbstractAggregationBuilder>,调用addAggregation方法(来自父类addAggregation)时会添加一个AggregationBuilder。有兴趣的读者也可以阅读源码的实现。
 
如果有什么问题,欢迎一起讨论,如果文中有什么错误,欢迎批评指正。
 
注:文中使用的Elastic Search API版本为2.3.2






 
继续阅读 »
以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置。
index的mapping为:
"mappings": {
"player": {
"properties": {
"name": {
"index": "not_analyzed",
"type": "string"
},
"age": {
"type": "integer"
},
"salary": {
"type": "integer"
},
"team": {
"index": "not_analyzed",
"type": "string"
},
"position": {
"index": "not_analyzed",
"type": "string"
}
},
"_all": {
"enabled": false
}
}
}

索引中的全部数据:

微信截图_20160920171030.png

 
首先,初始化Builder:
SearchRequestBuilder sbuilder = client.prepareSearch("player").setTypes("player");
接下来举例说明各种聚合操作的实现方法,因为在es的api中,多字段上的聚合操作需要用到子聚合(subAggregation),初学者可能找不到方法(网上资料比较少,笔者在这个问题上折腾了两天,最后度了源码才彻底搞清楚T_T),后边会特意说明多字段聚合的实现方法。另外,聚合后的排序也会单独说明。
  • group by/count

例如要计算每个球队的球员数,如果使用SQL语句,应表达如下:
select team, count(*) as player_count from player group by team;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
sbuilder.addAggregation(teamAgg);
SearchResponse response = sbuilder.execute().actionGet();
 
  • group by多个field

例如要计算每个球队每个位置的球员数,如果使用SQL语句,应表达如下:
select team, position, count(*) as pos_count from player group by team, position;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
TermsBuilder posAgg= AggregationBuilders.terms("pos_count").field("position");
sbuilder.addAggregation(teamAgg.subAggregation(posAgg));
SearchResponse response = sbuilder.execute().actionGet();
 
  • max/min/sum/avg

例如要计算每个球队年龄最大/最小/总/平均的球员年龄,如果使用SQL语句,应表达如下:
select team, max(age) as max_age from player group by team;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
MaxBuilder ageAgg= AggregationBuilders.max("max_age").field("age");
sbuilder.addAggregation(teamAgg.subAggregation(ageAgg));
SearchResponse response = sbuilder.execute().actionGet();

  • 对多个field求max/min/sum/avg

例如要计算每个球队球员的平均年龄,同时又要计算总年薪,如果使用SQL语句,应表达如下:
select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("team");
AvgBuilder ageAgg= AggregationBuilders.avg("avg_age").field("age");
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(ageAgg).subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
 
  • 聚合后对Aggregation结果排序

例如要计算每个球队总年薪,并按照总年薪倒序排列,如果使用SQL语句,应表达如下:
select team, sum(salary) as total_salary from player group by team order by total_salary desc;
ES的java api:
TermsBuilder teamAgg= AggregationBuilders.terms("team").order(Order.aggregation("total_salary ", false);
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
需要特别注意的是,排序是在TermAggregation处执行的,Order.aggregation函数的第一个参数是aggregation的名字,第二个参数是boolean型,true表示正序,false表示倒序。 
  • Aggregation结果条数的问题

默认情况下,search执行后,仅返回10条聚合结果,如果想反悔更多的结果,需要在构建TermsBuilder 时指定size:
TermsBuilder teamAgg= AggregationBuilders.terms("team").size(15);
 
  • Aggregation结果的解析/输出

得到response后:
Map<String, Aggregation> aggMap = response.getAggregations().asMap();
StringTerms teamAgg= (StringTerms) aggMap.get("keywordAgg");
Iterator<Bucket> teamBucketIt = teamAgg.getBuckets().iterator();
while (teamBucketIt .hasNext()) {
Bucket buck = teamBucketIt .next();
//球队名
String team = buck.getKey();
//记录数
long count = buck.getDocCount();
//得到所有子聚合
Map subaggmap = buck.getAggregations().asMap();
//avg值获取方法
double avg_age= ((InternalAvg) subaggmap.get("avg_age")).getValue();
//sum值获取方法
double total_salary = ((InternalSum) subaggmap.get("total_salary")).getValue();
//...
//max/min以此类推
}
 
  • 总结

综上,聚合操作主要是调用了SearchRequestBuilder的addAggregation方法,通常是传入一个TermsBuilder,子聚合调用TermsBuilder的subAggregation方法,可以添加的子聚合有TermsBuilder、SumBuilder、AvgBuilder、MaxBuilder、MinBuilder等常见的聚合操作。
 
从实现上来讲,SearchRequestBuilder在内部保持了一个私有的 SearchSourceBuilder实例, SearchSourceBuilder内部包含一个List<AbstractAggregationBuilder>,每次调用addAggregation时会调用 SearchSourceBuilder实例,添加一个AggregationBuilder。
同样的,TermsBuilder也在内部保持了一个List<AbstractAggregationBuilder>,调用addAggregation方法(来自父类addAggregation)时会添加一个AggregationBuilder。有兴趣的读者也可以阅读源码的实现。
 
如果有什么问题,欢迎一起讨论,如果文中有什么错误,欢迎批评指正。
 
注:文中使用的Elastic Search API版本为2.3.2






  收起阅读 »

成都地区Elastic中文社区线下活动通知公告!!!

Elastic中文社区技术沙龙【成都站】即将开始咯!
    Elastic 中文社区联手成都卡莱博尔信息技术股份有限公司共同举办线下技术分享会,欢迎对elastic、搜索引擎、大数据等相关技术感兴趣的朋友来参加。
   卡莱博尔是一家以“大数据、移动智能和认知计算”技术为核心的高新技术企业,公司坐落于成都市高新区天府五街,致力于成为中国高端装备产业大数据应用产品和服务提供商,主要为“国防军工、民用航空、先进船舶、轨道交通、电力能源”等装备行业,提供基于装备运行全生命周期故障预测与健康管理相关的大数据技术支撑和运营服务。
    ElasticSearch(下文简称ES)是当前流行的企业级搜索引擎,它提供了一个分布式多用户能力的全文搜索引擎。大数据时代ES能够提供简单易用的方式帮助企业从大型数据库中快速提取有效信息进行分析。
主办方:elastic中文社区        http://elasticsearch.cn/article/101
协办方:成都卡莱博尔信息技术股份有限公司  http://www.cdcalabar.com
 
海报图标.png


活动信息:
活动时间:2016年10月29日 下午13:00-17:30(本周六)
活动地点:成都市高新区天府软件园E区1栋10楼  成都卡莱博尔信息技术股份有限公司 多功能会议厅
           (活动地点如有变化,会提前通知)
场地容量:60人
活动费用:免费 
交通信息:地铁1号线  天府五街站下车  E区1栋10楼

分享主题:
(1)ES 在多维分析中的使用​  —— 李峰@ logicmonitor    logicmonitor数据平台高级工程师 
                                                     专注于hadoop生态系统相关实数数据的存储计算
(2)ElasticStack V5 新特性与变化   —— Medcl@elastic  Elastic中文社区创始人和布道师
ElasticStack包括Elasticsearch、Logstash、Kibana和Beats,ElasticStack将在过段时间发布一个V5.0全新版本,这次的分享将给大家介绍一下5.0版里面各个产品的一些新的特性和改进。曾勇是Elasticsearch国内首批用户,自2010年起就开始接触Elasticsearch并投入到生产环境中使用,并编写过一系列的中文处理相关的插件,是Elasticsearch中文社区发起人,筹办了一系列线上线下的Elasticsearch技术分享与交流活动,出于对Elasticsearch的喜爱,目前已全职加入Elasticsearch项目背后的Elastic公司。
(3)探究ES的内部存储结构  —— 林添@ logicmonitor    logicmonitor后端高级工程师  
                                   
PPT资料链接:https://github.com/rudyLi/es-chengdu-meetup-share​ 

报名方式:
 (1)报名连接:http://www.jsform.com/web/form ... fc6a6
 (2)扫描下面微信二维码加入成都Elastic微信群,无法扫描的同学加我微信(xcx_2013),我来拉你进群。电话:15008467351

真诚邀请对elastic技术、搜索引擎技术、大数据存储索引可视化、大数据分析、日志分析等技术感兴趣的朋友前来交流和分享。
 
继续阅读 »
Elastic中文社区技术沙龙【成都站】即将开始咯!
    Elastic 中文社区联手成都卡莱博尔信息技术股份有限公司共同举办线下技术分享会,欢迎对elastic、搜索引擎、大数据等相关技术感兴趣的朋友来参加。
   卡莱博尔是一家以“大数据、移动智能和认知计算”技术为核心的高新技术企业,公司坐落于成都市高新区天府五街,致力于成为中国高端装备产业大数据应用产品和服务提供商,主要为“国防军工、民用航空、先进船舶、轨道交通、电力能源”等装备行业,提供基于装备运行全生命周期故障预测与健康管理相关的大数据技术支撑和运营服务。
    ElasticSearch(下文简称ES)是当前流行的企业级搜索引擎,它提供了一个分布式多用户能力的全文搜索引擎。大数据时代ES能够提供简单易用的方式帮助企业从大型数据库中快速提取有效信息进行分析。
主办方:elastic中文社区        http://elasticsearch.cn/article/101
协办方:成都卡莱博尔信息技术股份有限公司  http://www.cdcalabar.com
 
海报图标.png


活动信息:
活动时间:2016年10月29日 下午13:00-17:30(本周六)
活动地点:成都市高新区天府软件园E区1栋10楼  成都卡莱博尔信息技术股份有限公司 多功能会议厅
           (活动地点如有变化,会提前通知)
场地容量:60人
活动费用:免费 
交通信息:地铁1号线  天府五街站下车  E区1栋10楼

分享主题:
(1)ES 在多维分析中的使用​  —— 李峰@ logicmonitor    logicmonitor数据平台高级工程师 
                                                     专注于hadoop生态系统相关实数数据的存储计算
(2)ElasticStack V5 新特性与变化   —— Medcl@elastic  Elastic中文社区创始人和布道师
ElasticStack包括Elasticsearch、Logstash、Kibana和Beats,ElasticStack将在过段时间发布一个V5.0全新版本,这次的分享将给大家介绍一下5.0版里面各个产品的一些新的特性和改进。曾勇是Elasticsearch国内首批用户,自2010年起就开始接触Elasticsearch并投入到生产环境中使用,并编写过一系列的中文处理相关的插件,是Elasticsearch中文社区发起人,筹办了一系列线上线下的Elasticsearch技术分享与交流活动,出于对Elasticsearch的喜爱,目前已全职加入Elasticsearch项目背后的Elastic公司。
(3)探究ES的内部存储结构  —— 林添@ logicmonitor    logicmonitor后端高级工程师  
                                   
PPT资料链接:https://github.com/rudyLi/es-chengdu-meetup-share​ 

报名方式:
 (1)报名连接:http://www.jsform.com/web/form ... fc6a6
 (2)扫描下面微信二维码加入成都Elastic微信群,无法扫描的同学加我微信(xcx_2013),我来拉你进群。电话:15008467351

真诚邀请对elastic技术、搜索引擎技术、大数据存储索引可视化、大数据分析、日志分析等技术感兴趣的朋友前来交流和分享。
  收起阅读 »

如何反向设置es mapping template

比如,由logstash打到es中的数据,除了其中一个字段比如message,其余字段都想设置为not analyzed,这种情况如何设置?貌似目前es只支持设置那些具体的字段为not analyzed,而不能反过来设置啊?
比如,由logstash打到es中的数据,除了其中一个字段比如message,其余字段都想设置为not analyzed,这种情况如何设置?貌似目前es只支持设置那些具体的字段为not analyzed,而不能反过来设置啊?

Elastic中文社区【深圳】第一次线下活动 开始报名啦!

Elastic中文社区技术沙龙【深圳站】 

es-vmic-weixin.png



PPT 下载: https://github.com/node/esmeetup-shenzhen2016 

活动现场:
Elastic技术沙龙_深圳站_大合影_final.jpg



活动信息:
  • 活动时间:2016年9月10日 下午13:00
  • 活动地点:深圳市福田区上梅林地铁站 安得街89号步步高大楼1楼
  • 场地容量:100人
  • 活动费用:免费 ( 现场有福利派发 : )
  • 交通信息:地铁4号龙华线 上梅林站 ,公交 万科大厦站
  • 参考地标:梅林天虹西侧,卓越城对面


报名方式:

qrcode.jpg


真诚邀请对elastic技术栈,搜索引擎技术,大数据存储索引可视化,日志分析等技术感兴趣的朋友前来交流和分享。

分享主题:
  • ElasticStack V5 新特性与变化              By 曾勇@elastic  Elastic开发工程师与技术布道师ElasticStack包括Elasticsearch、Logstash、Kibana和Beats,ElasticStack将在过段时间发布一个V5.0全新版本,这次的分享将给大家介绍一下5.0版里面各个产品的一些新的特性和改进。曾勇是Elasticsearch国内首批用户,自2010年起就开始接触Elasticsearch并投入到生产环境中使用,并编写过一系列的中文处理相关的插件,是Elasticsearch中文社区发起人,筹办了一系列线上线下的Elasticsearch技术分享与交流活动,出于对Elasticsearch的喜爱,目前已全职加入Elasticsearch项目背后的Elastic公司。
  • ELK应用 --- 一卡易实时日志分析平台   By 夏小成@一卡易   一线码农目前一卡易实时日志分析平台汇集了包括windows事务日志、linux日志、haproxy访问日志、业务数据库审计日志和大数据平台日志,为一卡易数十个产品线提供了便捷的日志检索和分析服务。未来我们会把elasticsearch逐渐引入到我们的业务系统,更深层次挖掘她的魅力。
  • 构建数据驱动的动画工作室 - es及ELK实践          By 赵昆@东方梦工厂   IT与数据系统工程师
  • 京东日志系统es运维经验分享及es源码改造实践   By 成睿 @京东曾负责京东日志系统的搜索平台,目前负责京东到家商品搜索平台。介绍京东日志系统es的一些运维经验和我2次改es源代码的实践。




----------------------------------------------------------------------------------
联络邮件: nodexy@qq.com 或者直接站内私信。----------------------------------------------------------------------------------

 
继续阅读 »
Elastic中文社区技术沙龙【深圳站】 

es-vmic-weixin.png



PPT 下载: https://github.com/node/esmeetup-shenzhen2016 

活动现场:
Elastic技术沙龙_深圳站_大合影_final.jpg



活动信息:
  • 活动时间:2016年9月10日 下午13:00
  • 活动地点:深圳市福田区上梅林地铁站 安得街89号步步高大楼1楼
  • 场地容量:100人
  • 活动费用:免费 ( 现场有福利派发 : )
  • 交通信息:地铁4号龙华线 上梅林站 ,公交 万科大厦站
  • 参考地标:梅林天虹西侧,卓越城对面


报名方式:

qrcode.jpg


真诚邀请对elastic技术栈,搜索引擎技术,大数据存储索引可视化,日志分析等技术感兴趣的朋友前来交流和分享。

分享主题:
  • ElasticStack V5 新特性与变化              By 曾勇@elastic  Elastic开发工程师与技术布道师ElasticStack包括Elasticsearch、Logstash、Kibana和Beats,ElasticStack将在过段时间发布一个V5.0全新版本,这次的分享将给大家介绍一下5.0版里面各个产品的一些新的特性和改进。曾勇是Elasticsearch国内首批用户,自2010年起就开始接触Elasticsearch并投入到生产环境中使用,并编写过一系列的中文处理相关的插件,是Elasticsearch中文社区发起人,筹办了一系列线上线下的Elasticsearch技术分享与交流活动,出于对Elasticsearch的喜爱,目前已全职加入Elasticsearch项目背后的Elastic公司。
  • ELK应用 --- 一卡易实时日志分析平台   By 夏小成@一卡易   一线码农目前一卡易实时日志分析平台汇集了包括windows事务日志、linux日志、haproxy访问日志、业务数据库审计日志和大数据平台日志,为一卡易数十个产品线提供了便捷的日志检索和分析服务。未来我们会把elasticsearch逐渐引入到我们的业务系统,更深层次挖掘她的魅力。
  • 构建数据驱动的动画工作室 - es及ELK实践          By 赵昆@东方梦工厂   IT与数据系统工程师
  • 京东日志系统es运维经验分享及es源码改造实践   By 成睿 @京东曾负责京东日志系统的搜索平台,目前负责京东到家商品搜索平台。介绍京东日志系统es的一些运维经验和我2次改es源代码的实践。




----------------------------------------------------------------------------------
联络邮件: nodexy@qq.com 或者直接站内私信。----------------------------------------------------------------------------------

  收起阅读 »

kibana使用echarts

最近被催着要在kibana里加入关系图(社交网络类似的),然后百度的echarts支持关系图。之前一直以为修改kibana加入echarts会很难(因为node我不会,angularjs我也不会。。。),直到今天被逼要在几天之内加入关系图,我发现,加入echarts真的不太难!
我的做法是
①cd 进kibana的根目录,然后vim package.json,在dependencies中加入"echarts":"3.2.2"(key value结构,3.2.2是echarts最新版本)
②在kibana根目录使用npm update命令,会自动下载echats.
③npm start 开启debug模式
④在要修改的js 文件中加入let echarts=requrie("echarts");即可调用echarts进行开发了!
 
继续阅读 »
最近被催着要在kibana里加入关系图(社交网络类似的),然后百度的echarts支持关系图。之前一直以为修改kibana加入echarts会很难(因为node我不会,angularjs我也不会。。。),直到今天被逼要在几天之内加入关系图,我发现,加入echarts真的不太难!
我的做法是
①cd 进kibana的根目录,然后vim package.json,在dependencies中加入"echarts":"3.2.2"(key value结构,3.2.2是echarts最新版本)
②在kibana根目录使用npm update命令,会自动下载echats.
③npm start 开启debug模式
④在要修改的js 文件中加入let echarts=requrie("echarts");即可调用echarts进行开发了!
  收起阅读 »

在一个Elasticsearch集群中可以使用过个版本数据节点共存吗?

我们现在Elasticsearch的版本较老,然后数据量比较大,我不知道有平滑升级的方案不?如果有,该怎么做?如果没有,我是否可以把新版本的节点加入到老版本的集群中使用,两个版本共存,然后最后老数据删除,老版本的数据节点也就删除了,想问一下我想的方案是否可行?
 
两个版本共存在一个集群中,会出现哪些可预知的问题?还希望了解的同学回答一下?谢谢!
继续阅读 »
我们现在Elasticsearch的版本较老,然后数据量比较大,我不知道有平滑升级的方案不?如果有,该怎么做?如果没有,我是否可以把新版本的节点加入到老版本的集群中使用,两个版本共存,然后最后老数据删除,老版本的数据节点也就删除了,想问一下我想的方案是否可行?
 
两个版本共存在一个集群中,会出现哪些可预知的问题?还希望了解的同学回答一下?谢谢! 收起阅读 »

laravel5.2 & es2.3.4 Demo

http://laravel.fuxiben.com/elastic  测试地址 
https://github.com/zhuowenji/Laravel5.2-Demo   github地址 
 
 
搞了一晚上,头疼,高亮,分页,高级搜索还没搞。大家有建议或者 demo的一起分享下!
继续阅读 »
http://laravel.fuxiben.com/elastic  测试地址 
https://github.com/zhuowenji/Laravel5.2-Demo   github地址 
 
 
搞了一晚上,头疼,高亮,分页,高级搜索还没搞。大家有建议或者 demo的一起分享下! 收起阅读 »

尝试翻译 ElasticSearch 官方文档

最近有翻译官网文档的念头,从上周开始陆陆续续的抽时间翻译,因为工作比较忙,都是晚上熬夜开始翻译的。想要翻译官方文档的原因主要有这几点:
  1. 官方文档写的比较好,例子多,容易理解;
  2. 已有的翻译资料感觉并不是很完善,要么只翻译了一部分,要么版本很旧,很久没人维护(有人翻译 ElasticSearch 权威指南,这个还是不错);
  3. 自己在工作中经常用到 ElasticSearch,感觉 ElasticSearch 非常强大,帮助我们解决了很多问题,让我有激情去更深入的探索;
  4. 希望可以帮助到别人;

 
github:  https://github.com/liuzxc/Elasticsearch_reference_cn
 
read online :   https://liuzxc.gitbooks.io/elasticsearch_reference_cn/content/
 
我现在基本上每天翻译 1- 2 节的样子,会持续更新下去,有兴趣的伙伴可以加入进来一起搞!
继续阅读 »
最近有翻译官网文档的念头,从上周开始陆陆续续的抽时间翻译,因为工作比较忙,都是晚上熬夜开始翻译的。想要翻译官方文档的原因主要有这几点:
  1. 官方文档写的比较好,例子多,容易理解;
  2. 已有的翻译资料感觉并不是很完善,要么只翻译了一部分,要么版本很旧,很久没人维护(有人翻译 ElasticSearch 权威指南,这个还是不错);
  3. 自己在工作中经常用到 ElasticSearch,感觉 ElasticSearch 非常强大,帮助我们解决了很多问题,让我有激情去更深入的探索;
  4. 希望可以帮助到别人;

 
github:  https://github.com/liuzxc/Elasticsearch_reference_cn
 
read online :   https://liuzxc.gitbooks.io/elasticsearch_reference_cn/content/
 
我现在基本上每天翻译 1- 2 节的样子,会持续更新下去,有兴趣的伙伴可以加入进来一起搞! 收起阅读 »

Packetbeat的Cassandra协议扩展

论坛有多少人在用Cassandra的啊?弄了一个Cassandra的协议,有在用的Cassandra么?帮忙测试一下,看看有没有bug,
欢迎反馈。
 
https://github.com/elastic/beats/pull/1959
 
继续阅读 »
论坛有多少人在用Cassandra的啊?弄了一个Cassandra的协议,有在用的Cassandra么?帮忙测试一下,看看有没有bug,
欢迎反馈。
 
https://github.com/elastic/beats/pull/1959
  收起阅读 »

Lucene5.5入门第十篇完结篇——使用Highlighter使关键词高亮

前言

我们在使用百度和谷歌等搜索引擎的时候,你会发现,搜索引擎会把和我们输入的关键字以红色的字体显示,来突出显示结果的准确性,这就是高亮显示的使用场景

准备

使用Highlighter需要导入相应的jar包,maven项目可以加入如下依赖

<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>5.5.0</version>
</dependency>

直接看代码


/**
* @author kl by 2016/3/19
* @boke www.kailing.pub
*/
public class FieldSetBoostTest {
//索引目录
String indexDir="E:\\LuceneIndex";
//测试数据
String theme="中国";
String []title={"中国是一个伟大的国家","我爱你的的祖国,美丽的中国","是什么,中国令美日等国虎视眈眈"};
/**
* Lucence5.5返回IndexWriter实例
* @param directory
* @return
*/
public IndexWriter getIndexWriter(Directory directory){
Analyzer analyzer=new CJKAnalyzer();//中日韩二元分词
IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);
IndexWriter writer=null;
try {
writer =new IndexWriter(directory,writerConfig);
}catch (Exception e){
e.printStackTrace();
}
return writer;
}
public Directory getDirctory(String indexDir){
Directory directory=null;
try {
directory=FSDirectory.open(Paths.get(indexDir));
}catch (IOException e){
e.printStackTrace();
}
return directory;
}
/**
* 创建索引不加权
* @throws Exception
*/
public void Indexer()throws Exception{
IndexWriter writer=getIndexWriter(getDirctory(indexDir));
Document doc=null;
for(String str:title){
doc=new Document();
//Lucence5.5 Fileld有多个实现,StringFIeld不分词 TextField分词
doc.add(new StringField("theme",theme, Field.Store.YES));
Field field=new TextField("title",str, Field.Store.YES);
doc.add(field);
writer.addDocument(doc);
}
writer.close();
}

/**
* 关键命中词高亮输出处理
* @param query
* @param context
* @return
* @throws Exception
*/
public static String getHighlighterString(Query query,String context)throws Exception{
//对促成文档匹配的实际项进行评分
QueryScorer scorer=new QueryScorer(query);
//设置高亮的HTML标签格式
Formatter simpleHTMLFormatter=new SimpleHTMLFormatter("","");
//实例化高亮分析器
Highlighter highlighter=new Highlighter(simpleHTMLFormatter,scorer);
//提供静态方法,支持从数据源中获取TokenStream,进行token处理
TokenStream tokenStream=new CJKAnalyzer().tokenStream("title", new StringReader(context));
return highlighter.getBestFragment(tokenStream, context);
}
@Test
public void searcherTest()throws Exception{
// Indexer();
IndexReader reader= DirectoryReader.open(getDirctory(indexDir));
IndexSearcher is=new IndexSearcher(reader);
System.out.println("总的文档数:"+reader.numDocs());
QueryParser qp=new QueryParser("title",new CJKAnalyzer());
String q="中国";
Query query=qp.parse(q);
TopDocs tDocs=is.search(query,11);
System.out.println("查询-》"+q+"《-总共命中【"+tDocs.totalHits+"】条结果");
for (ScoreDoc scoredoc:tDocs.scoreDocs){
Document doc = is.doc(scoredoc.doc);
String context=doc.get("title");
if(context!=null){
System.out.println(getHighlighterString(query,context));
}

}
}
}
查询效果如下:

原文地址:http://www.kailing.pub/article/index/arcid/82.html
继续阅读 »
前言

我们在使用百度和谷歌等搜索引擎的时候,你会发现,搜索引擎会把和我们输入的关键字以红色的字体显示,来突出显示结果的准确性,这就是高亮显示的使用场景

准备

使用Highlighter需要导入相应的jar包,maven项目可以加入如下依赖

<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>5.5.0</version>
</dependency>

直接看代码


/**
* @author kl by 2016/3/19
* @boke www.kailing.pub
*/
public class FieldSetBoostTest {
//索引目录
String indexDir="E:\\LuceneIndex";
//测试数据
String theme="中国";
String []title={"中国是一个伟大的国家","我爱你的的祖国,美丽的中国","是什么,中国令美日等国虎视眈眈"};
/**
* Lucence5.5返回IndexWriter实例
* @param directory
* @return
*/
public IndexWriter getIndexWriter(Directory directory){
Analyzer analyzer=new CJKAnalyzer();//中日韩二元分词
IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);
IndexWriter writer=null;
try {
writer =new IndexWriter(directory,writerConfig);
}catch (Exception e){
e.printStackTrace();
}
return writer;
}
public Directory getDirctory(String indexDir){
Directory directory=null;
try {
directory=FSDirectory.open(Paths.get(indexDir));
}catch (IOException e){
e.printStackTrace();
}
return directory;
}
/**
* 创建索引不加权
* @throws Exception
*/
public void Indexer()throws Exception{
IndexWriter writer=getIndexWriter(getDirctory(indexDir));
Document doc=null;
for(String str:title){
doc=new Document();
//Lucence5.5 Fileld有多个实现,StringFIeld不分词 TextField分词
doc.add(new StringField("theme",theme, Field.Store.YES));
Field field=new TextField("title",str, Field.Store.YES);
doc.add(field);
writer.addDocument(doc);
}
writer.close();
}

/**
* 关键命中词高亮输出处理
* @param query
* @param context
* @return
* @throws Exception
*/
public static String getHighlighterString(Query query,String context)throws Exception{
//对促成文档匹配的实际项进行评分
QueryScorer scorer=new QueryScorer(query);
//设置高亮的HTML标签格式
Formatter simpleHTMLFormatter=new SimpleHTMLFormatter("","");
//实例化高亮分析器
Highlighter highlighter=new Highlighter(simpleHTMLFormatter,scorer);
//提供静态方法,支持从数据源中获取TokenStream,进行token处理
TokenStream tokenStream=new CJKAnalyzer().tokenStream("title", new StringReader(context));
return highlighter.getBestFragment(tokenStream, context);
}
@Test
public void searcherTest()throws Exception{
// Indexer();
IndexReader reader= DirectoryReader.open(getDirctory(indexDir));
IndexSearcher is=new IndexSearcher(reader);
System.out.println("总的文档数:"+reader.numDocs());
QueryParser qp=new QueryParser("title",new CJKAnalyzer());
String q="中国";
Query query=qp.parse(q);
TopDocs tDocs=is.search(query,11);
System.out.println("查询-》"+q+"《-总共命中【"+tDocs.totalHits+"】条结果");
for (ScoreDoc scoredoc:tDocs.scoreDocs){
Document doc = is.doc(scoredoc.doc);
String context=doc.get("title");
if(context!=null){
System.out.println(getHighlighterString(query,context));
}

}
}
}
查询效果如下:

原文地址:http://www.kailing.pub/article/index/arcid/82.html 收起阅读 »