摘要:本文所讲述的内容,为ElasticSearch(如下简称ES)全文搜索引擎在实际大数据项目的应用;ES的底层是开源库 Lucene。可是,你无法直接用 Lucene,必须本身写代码去调用它的接口。ES 是 Lucene 的封装,java开发,提供了 REST API 的操做接口,开箱即用,是目前全文搜索的首选;html
本文的使用项目为基于Spring Boot 的快速开发环境搭建的项目框架,使用Spring Cloud做为服务治理的框架;集成ES的过程当中,考虑过使用Spring Data的方式集成,进行数据的对接,后面经过多方面的调研和学习讨论,最终肯定了bboss的集成方案,一个 高性能elasticsearch ORM开发库使用介绍,在这里特别感谢bboss的做者大河和他的团队提供的帮助;java
1、ES基础git
网上关于ES的介绍已经特别多,这里将再也不进行详细介绍,只是针对几个重点进行说明;数据库
推荐刚开始的小伙伴去看一看阮一峰老师的博客:全文搜索引擎 Elasticsearch 入门教程apache
一、Index (索引)--能够理解为关系型数据库中的 数据库的概念json
一个索引就是含有某些类似特性的文档的集合。例如,你能够有一个用户数据的索引,一个产品目录的索引,还有其余的有规则数据的索引。一个索引被一个名称(必须都是小写)惟一标识,而且这个名称被用于索引经过文档去执行索引,搜索,更新和删除操做。安全
二、Type(类型)--能够理解为关系型数据库中的 表的概念(6.2版本中一个index下只有一个Type)网络
三、Document(文档)--能够理解为关系型数据库中表的ROW多线程
一个文档是一个可被索引的数据的基础单元。例如,你能够给一个单独的用户建立一个文档,给单个产品建立一个文档,以及其余的单独的规则。这个文档用JSON格式表现,JSON是一种广泛的网络数据交换格式。架构
四、Field(字段)--至关于表中的COLUMN
五、在一个关系型数据库里面,schema定义了表、每一个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何创建、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否须要分词处理、如何进行分词处理等。
六、ELK是什么?
ELK=elasticsearch+Logstash+kibana
elasticsearch:后台分布式存储以及全文检索
logstash: 日志加工、“搬运工”
kibana:数据可视化展现。 特别是在DSL的学习过程当中,至关于数据库的可视化工具,实时交互操做。
ELK架构为数据分布式存储、可视化查询和日志解析建立了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工做。
2、ES能解决什么样的问题?
实际项目开发实战中,几乎每一个系统都会有一个搜索的功能,当搜索作到必定程度时,维护和扩展起来难度就会慢慢变大,因此不少公司都会把搜索单独独立出一个模块,用ElasticSearch等来实现。近年ElasticSearch发展迅猛,已经超越了其最初的纯搜索引擎的角色,如今已经增长了数据聚合分析(aggregation)和可视化的特性,若是你有数百万的文档须要经过关键词进行定位时,ElasticSearch确定是最佳选择。固然,若是你的文档是JSON的,你也能够把ElasticSearch看成一种“NoSQL数据库”, 应用ElasticSearch数据聚合分析(aggregation)的特性,针对数据进行多维度的分析。
而在本文的项目中,舆情监测部分,搜索功能将是该模块的核心功能;包括条件检索,中文分词,全文搜索等功能,而BBOSS对于该部分功能的实现,提供了极大的便利;
3、ES环境搭建和在项目中的应用
一、ES集群搭建,关于ES集群的搭建,这里再也不单独介绍,推荐的博客特别多。但有一点要注意,就是不一样版本的ES对于功能的支持会有一些区别,要注意;
二、ES的查询语法;项目集成BBOSS后,比较相似Mybatis框架,直接完成DSL语句的编写放入XML,经过对应的DAO方法调用便可,因此ES的查询语法是ES学习的重点,也是ES进阶的重点,不一样的需求对于DSL的查询复杂度不一,能够经过ES的中文官方网站进行阅读学习,并在自身搭建的ES集群提供的kibana中进行操做,ES权威中文指南
三、项目集成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
四、提供一个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" } } ] }
五、关于分词器,这里仍是推荐IK分词吧,IK分词能够设置 ik_smart 或者 ik_max_word,这里不作详解,推荐使用ik_max_word
写在最后的话,ES是一个很是强大的搜索引擎,要入门不是很难,可是要精通查询,查询优化,最大程度的搜索最想要的结果是有不少优化的余地的,包括评分机制,包括新版本提供的聚合功能等,只能说,加油学习吧