用Elasticsearch做大规模数据的多字段、多类型索引检索

本文同时发布在我的个人博客

之前尝试了用mysql做大规模数据的检索优化,可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景。

但是实际应用往往会复杂一些 —— 各类索引(关键词匹配、全文检索、时间范围)混合使用,还有排序的需求。这种情况下mysql就有点力不从心了,复杂的索引类型,在多索引检索的时候对每个字段单独建索引于事无补,而联合索引无法在如此复杂的索引类型下建起来。

用ElasticSearch来解决这个场景的问题就要简单的多了。那么如何用elastic来解决这个问题呢? 还是带着业务需求来实践一遍吧:

①检索字段有7个,4个关键词匹配,1个特殊要求的a=b&c=d的分段全文检索,1个中文全文检索,1个时间范围

②数据量很大,需要支持3个月数据的检索,最好能按月建索引,方便冷备、恢复

1. ElasticSearch Demo Server/Client 环境搭建

为了快速学习elasticsearch的api,可以在本地快速搭建一个demo环境

1.1 elasticsearch server

step1.安装jdk1.8

https://www.oracle.com/technetwork/java/javase/downloads/index.html 官网下载安装、配置好环境变量即可

step2.安装elasticsearch

https://www.elastic.co/cn/downloads/elasticsearch 同样的,官网下载对应平台的包,这个甚至不需要,直接加压,就可以在bin目录下看到服务的启动文件

我使用的是windows平台版本的,运行bin目录下elasticsearch.bat,稍等片刻,访问 http://localhost:9200

看到此截图说明elasticsearch demo server启动成功。

step3.安装中文分词器

文章开头的需求中提到,有需要中文分词全文索引的字段,所以需要额外安装一下中文分词器。https://github.com/medcl/elasticsearch-analysis-ik/tree/v7.0.0 上官网下载对应elasticsearch版本tag的ik源码包,比如我使用的最新版本7.0.0,ik也需要下载对应版本的。

elasticsearh是用java写的,需要安装maven以编译此项目。http://maven.apache.org/download.cgi官网下载对应平台的安装包,编译或解压,配置好环境变量。

解压ik代码压缩包,在其根目录运行mvn clean && mvn compile && mvn package,编译打包

将target/releasa下生成的编译好的文件,解压到elasticsearch/plugin/ik目录下,重启elasticsearch,启动成功则说明安装成功(或者直接在github下载对应的release版本)。ik分词器没办法直接测试,需要先建好index,再在index下的分词器中测试,在后文进行。

1.2 elasticsearch client

elasticsearch server以http协议接口的方式提供服务,官方提供了客户端的nodejs sdk :https://github.com/elastic/elasticsearch-js,文档在这里https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#_index

用法这里先不赘述。

2.ElasticSearch使用

正如官网所说,elasticsearch是一个简单的引擎,同时也是一个复杂的引擎,提供不同级别的配置以实现不同复杂度的需求。网上elastic入门的文章,大多以比较简单的方式介绍入门级别的使用,但是真正用到产品中的时候,还是要思考一些问题: 如何配置索引字段、如何发起检索请求、如何添加额外配置。带着这些问题通读一遍官网文档,再来真正使用它,相对来说是比较好一点的。

2.1创建Index

写入数据之前,首先得考虑如何创建各种不同类型的index,以满足分词、检索、排序、统计的需求,官方文档对这块的描述在这里:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html,真正开始创建index之前,推荐把mapping的文档通读一遍,这样才知道如何选择合适的type。

2.1.1 Keyword类型字段

首先是4个关键词索引的字段,比较简单,直接创建keyword类型的property就可以了:

const { Client } = require('@elastic/elasticsearch')
const client = new Client({ node: 'http://localhost:9200' })

client.indices.create({
        index: "asrtest1",
        include_type_name: false,
        body:{
            "mappings" : {
                "properties" : {
                    "id" :       { "type" : "keyword" },
                    &
  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶依旧很红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值