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

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

  一、ES基础

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

推荐刚开始的小伙伴去看一看阮一峰老师的博客:全文搜索引擎 Elasticsearch 入门教程

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

ElasticSearch[v6.2] 在实际项目中的应用的更多相关文章

  1. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)

    项目中需要搜索, 所以从零开始学习大家都在用的搜索神器 elasiticsearch. 刚开始 google 的时候, 搜到好多经验贴和视频(中文的, 英文的), 但是由于是第一次接触, 一点概念都没 ...

  2. java使用elasticsearch进行模糊查询-已在项目中实际应用

    java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...

  3. ElasticSearch搜索引擎在JavaWeb项目中的应用

    近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...

  4. 【主流技术】ElasticSearch 在 Spring 项目中的实践

    前言 ElasticSearch简称es,是一个开源的高扩展的分布式全文检索引擎. 它可以近乎实时的存储.检索数据,其扩展性很好,ElasticSearch是企业级应用中较为常见的技术. 下面和大家分 ...

  5. 在 .NetCore 项目中使用 SkyWalkingAPM 踩坑排坑日记

    SkyWalking 概述 SkyWalking 是观察性分析平台和应用性能管理系统.提供分布式追踪.服务网格遥测分析.度量聚合和可视化一体化解决方案.支持Java, .Net Core, PHP, ...

  6. eclipse导入web项目之后项目中出现小红叉解决办法

    项目中有小红叉我遇到的最常见的情况: 1.项目代码本身有问题.(这个就不说了,解决错误就OK) 2.项目中的jar包丢失.(有时候eclipse打开时会出现jar包丢失的情况,关闭eclipse重新打 ...

  7. MongoDB在实际项目中的使用

    MongoDB简介 MongoDB是近些年来流行起来的NoSql的代表,和传统数据库最大的区别是支持文档型数据库. 当然,现在的一些数据库通过自定义复合类型,可变长数组等手段也可以模拟文档型数据库. ...

  8. [多线程] Web 项目中,少有涉及到的一次多线程编程的经验

    如今框架横行,Spring 已经是非常成熟的容器体系,我们在日常开发 JavaWeb 的工作中,大多已经不需要考虑多线程的问题,这些问题都已经在Spring容器中实现,框架的意义就是让程序员们可以专注 ...

  9. React-Native集成到已有项目中的总结

    安装Python 从官网下载并安装python 2.7.x(3.x版本不行) 安装node.js 从官网下载node.js的官方V6.X.X版本或更高版本.安装完成后检测是否安装成功:node -v ...

随机推荐

  1. linux中O(1)调度算法与全然公平(CFS)调度算法

    一.O(1)调度算法 1.1:优先级数组 O(1)算法的:一个核心数据结构即为prio_array结构体. 该结构体中有一个用来表示进程动态优先级的数组queue,它包括了每一种优先级进程所形成的链表 ...

  2. Linux学习笔记——例说makefile 索引博文

    0.前言     从学习C语言開始就慢慢開始接触makefile.查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

  3. Maximal Rectangle [leetcode] 的三种思路

    第一种方法是利用DP.时间复杂度是 O(m * m * n) dp(i,j):矩阵中同一行以(i,j)结尾的所有为1的最长子串长度 代码例如以下: int maximalRectangle(vecto ...

  4. win7_64

    转到YLMF DOS工具,输入ghost然后回车 enter后 选择options进入

  5. use 在php 用法中的总结

    1.命名空间 2.匿名函数 3.多继承 4.暂时想到这三个,如果有请补充在评论区

  6. gcc 4.8安装

    suse的安装参考:http://blog.csdn.net/cloudskyfhx/article/details/17660607 有些错误处理见本文黄色部分 CentOS 6.4 编译安装 gc ...

  7. oracle中关于删除表purge语句和闪回语句的基本使用

    语法: drop table ... purge; 例子:drop table test purge; purge是直接删除表,不保留到回收站,10G开始默认drop表式改名移动到回收站; 闪回(fl ...

  8. C# List<T>转成DataTable

    //将List<T>转成DataTable         public static DataTable ToDataTable(List<T> collection)    ...

  9. 12) 十分钟学会android--APP通信传递消息之简单数据传输

    程序间可以互相通信是Android程序中最棒的功能之一.当一个功能已存在于其他app中,且并不是本程序的核心功能时,完全没有必要重新对其进行编写. 本章节会讲述一些通在不同程序之间通过使用Intent ...

  10. div 内容水平垂直居中

    对于前端布局来说.总有一些图片水平垂直居中老是不好看,影响整体美观,百度一大堆各种自适应方法,终于找到了一种比较简单,适用于所有场景的方法.. 1.对于布局来说.一个div搞定. <div id ...