ElasticSearch[v6.2] 在实际项目中的应用

栏目: 数据库 · 发布时间: 5年前

内容简介:摘要:本文所讲述的内容,为ElasticSearch(以下简称ES)全文搜索引擎在实际大数据项目的应用;ES的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。ES 是 Lucene 的封装,java开发,提供了 REST API 的操作接口,开箱即用,是目前全文搜索的首选;本文的使用项目为基于Spring Boot 的快速开发环境搭建的项目框架,使用Spring Cloud作为服务治理的框架;集成ES的过程中,考虑过使用Spring Data的方式集成,进行数据

摘要:本文所讲述的内容,为ElasticSearch(以下简称ES)全文搜索引擎在实际大数据项目的应用;ES的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。ES 是 Lucene 的封装,java开发,提供了 REST API 的操作接口,开箱即用,是目前全文搜索的首选;

本文的使用项目为基于Spring Boot 的快速开发环境搭建的项目框架,使用Spring Cloud作为服务治理的框架;集成ES的过程中,考虑过使用Spring Data的方式集成,进行数据的对接,后面通过多方面的调研和学习讨论,最终确定了bboss的集成方案,一个 高性能elasticsearch ORM开发库使用介绍,在这里特别感谢bboss的作者大河和他的团队提供的帮助;

一、ES基础

网上关于ES的介绍已经特别多,这里将不再进行详细介绍,只是针对几个重点进行说明;

1、Index (索引)--可以理解为关系型数据库中的 数据库的概念

一个索引就是含有某些相似特性的文档的集合。例如,你可以有一个用户数据的索引,一个产品目录的索引,还有其他的有规则数据的索引。一个索引被一个名称(必须都是小写)唯一标识,并且这个名称被用于索引通过文档去执行索引,搜索,更新和删除操作。

2、Type(类型)--可以理解为关系型数据库中的 表的概念(6.2版本中一个index下只有一个Type)

3、Document(文档)--可以理解为关系型数据库中表的ROW

一个文档是一个可被索引的数据的基础单元。例如,你可以给一个单独的用户创建一个文档,给单个产品创建一个文档,以及其他的单独的规则。这个文档用JSON格式表现,JSON是一种普遍的网络数据交换格式。

4、Field(字段)--相当于表中的COLUMN

5、在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。

6、ELK是什么?

ELK=elasticsearch+Logstash+kibana

elasticsearch:后台分布式存储以及全文检索

logstash: 日志加工、“搬运工”

kibana:数据可视化展示。 特别是在DSL的学习过程中,相当于数据库的可视化工具,实时交互操作。

ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作。

二、ES能解决什么样的问题?

实际项目开发实战中,几乎每个系统都会有一个搜索的功能,当搜索做到一定程度时,维护和扩展起来难度就会慢慢变大,所以很多公司都会把搜索单独独立出一个模块,用ElasticSearch等来实现。近年ElasticSearch发展迅猛,已经超越了其最初的纯搜索引擎的角色,现在已经增加了数据聚合分析(aggregation)和可视化的特性,如果你有数百万的文档需要通过关键词进行定位时,ElasticSearch肯定是最佳选择。当然,如果你的文档是JSON的,你也可以把ElasticSearch当作一种“NoSQL数据库”, 应用ElasticSearch数据聚合分析(aggregation)的特性,针对数据进行多维度的分析。

而在本文的项目中,舆情监测部分,搜索功能将是该模块的核心功能;包括条件检索,中文分词,全文搜索等功能,而BBOSS对于该部分功能的实现,提供了极大的便利;

三、ES环境搭建和在项目中的应用

1、ES集群搭建,关于ES集群的搭建,这里不再单独介绍,推荐的博客特别多。但有一点要注意,就是不同版本的ES对于功能的支持会有一些区别,要注意;

2、ES的查询语法;项目集成BBOSS后,比较类似Mybatis框架,直接完成DSL语句的编写放入XML,通过对应的DAO方法调用即可,所以ES的查询语法是ES学习的重点,也是ES进阶的重点,不同的需求对于DSL的查询复杂度不一,可以通过ES的中文官方网站进行阅读学习,并在自身搭建的ES集群提供的kibana中进行操作,ES权威中文指南

3、项目集成bboss

第一步、maven引入包

<dependency>

<groupId>com.bbossgroups.plugins</groupId>

<artifactId>bboss-elasticsearch-rest</artifactId>

<version>5.0.6.3</version>

</dependency>

第二步、bboss elasticsearch配置

运行bboss es需要三个配置文件,放到资源目录(resources)的conf目录下即可:

conf/elasticsearch.xml        es客户端配置文件

conf/httpclient.xml            es http连接池配置文件

conf/elasticsearch.properties  es参数配置文件,在上面的两个xml文件中引用,所以我们只需要修改elasticsearch.properties即可。

第三步、配置ES查询DSL

在resources下创建配置文件estrace/xxx.xml,配置一个query dsl脚本,名称为queryServiceByCondition,我们将在后面的ClientInterface 组件中通过queryServiceByCondition引用这个脚本,定义脚本内容;

加载query dsl文件,并执行查询操作

@Override

public String searchInfo(JSONObject jsonObject) {

Map<String, Object> params = formatParams(jsonObject);

JSONObject result = new JSONObject();

//创建加载配置文件的客户端工具,用来检索文档,单实例多线程安全

ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/opinion.xml");

ESDatas<OpinionInfo> esDatas = clientUtil.searchList("act_yq_info_summary/_search",//act_yq_info_summary为索引名称,search为操作的action

"searchOpinionInfo",//esmapper/opinion.xml中定义的dsl语句

params, OpinionInfo.class);

result.put("esDatas", esDatas);

return JSONObject.toJSONString(result);

}

关于BBOSS语法的具体学习,可以移步到  高性能elasticsearch ORM开发库使用介绍,或者入QQ群 166471282

4、提供一个mapping设置和dsl的示例,仅供参考;

PUT /act_yq_info_summary/

"settings":{ 

"number_of_shards":6,

"index.refresh_interval": "5s",

"analysis" : {

"analyzer" : {

"ik" : {

"tokenizer" : "ik_max_word"

}

}

}

},

"mappings":{ 

"articles":{ 

"dynamic_date_formats":[ 

"yyyy-MM-dd HH:mm:ss",

"yyyyMMdd",

"yyyy-MM-dd"

],

"dynamic":"false",

"properties":{ 

"infoUid":{ 

"type":"text"

},

"compareId":{ 

"type":"text"

},

"plats":{ 

"type":"keyword"

},

"keyWords":{ 

"type":"keyword"

},

"infoTitle":{ 

"type":"text",

"store":true,

"analyzer" : "ik_max_word"

},

"infoDetail":{ 

"type":"text",

"store":true,

"analyzer" : "ik_max_word"

},

"infoUrl":{ 

"type":"text"

},

"pubTime":{ 

"type":"date",

"format":"yyyy-MM-dd HH:mm:ss"

},

"platsType":{ 

"type":"keyword"

},

"mlEmotion":{ 

"type":"keyword"

},

"userEmotion":{ 

"type":"keyword"

}

}

}

}

}

查询的DSL

GET act_yq_info_summary/_search

{

"query": {

"bool": {

"must": [{

"bool": {

"should": [{

"match": {

"infoDetail": "乔军"

}

},

{

"match": {

"infoTitle": "乔军"

}

}

]

}

},

{

"terms": {

"userEmotion": ["pos", "neg", "neu"]

}

}

],

"filter": {

"bool": {

"must": [{

"terms": {

"plats": ["jingdong", "toutiao_news", "toutiao_ans", "sina_blog", "sina_com", "bd_news", "bd_konws", "bd_tieba", "zhihu_ques", "zhihu_ans"]

}

},

{

"range": {

"pubTime": {

"gte": "2016-05-01 00:00:00",

"lte": "2018-05-07 23:59:59"

}

}

},

{

"terms": {

"keyWords": ["蓝月亮湖南卫视中秋晚会", "蓝月亮央视中秋晚会", "蓝月亮旋风孝子"]

}

}

]

}

}

}

},

"highlight": {

"fields": [{

"infoTitle": {}

},

{

"infoDetail": {}

}

]

},

"from": 0,

"size": 10,

"sort": [{

"_score": {

"order": "desc"

}

},

{

"pubTime": {

"order": "desc"

}

}

]

}

5、关于分词器,这里还是推荐IK分词吧,IK分词可以设置 ik_smart  或者  ik_max_word,这里不做详解,推荐使用ik_max_word

写在最后的话,ES是一个非常强大的搜索引擎,要入门不是很难,但是要精通查询,查询优化,最大程度的搜索最想要的结果是有很多优化的余地的,包括评分机制,包括新版本提供的聚合功能等,只能说,加油学习吧

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-11/155329.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web开发秘方

Web开发秘方

Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / 七印部落 / 华中科技大学出版社 / 2013-7-10 / 66.00元

猜猜硅谷的前端工程师怎么折腾JS的?想知道无限下拉的列表怎么做吗?你知道DropBox可以当Web服务器用吗?你知道怎么做出跨平台的幻灯片效果吗?不借助插件,怎样在移动设备上实现动画效果?怎样快速搭建和测试HTML电子邮箱?怎样制作跨PC和移动设备显示的应用界面?怎样利用最新的JavaScript框架(Backbone和Knockout)提高应用的响应速度?怎样有效利用CoffeeScript和S......一起来看看 《Web开发秘方》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码