阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

228次阅读
没有评论

共计 5577 个字符,预计需要花费 14 分钟才能阅读完成。

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

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5577字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中