Elasticsearch索引的简单理解

最近项目中需要做一个聚合搜索的功能,打算将订单、客户、产品、成本等数据同步至es实现

在准备上手往项目里引入es时,发现由于对es底层原理缺乏认知,因此同步数据不清楚如何设置索引和数据格式才能更符合es的特性

而在网上查es的索引,基本上都只查到两类文章:

  1. 关于倒排索引的原理
    倒排索引解释图
  2. es的索引与mysql的索引的对比
    es的索引与mysql的索引的对比

我最开始一直错误地将es底层倒排索引的概念理解即为代码中设置es的索引,认为es的索引库即为需要查询的分词的集合,按这样理解,若需要根据客户名称、电话取搜索关联的订单信息,那岂不是所有的客户姓名、客户电话都需要设置为索引……想想也不对劲

最后在掘金发现一篇文章,才恍然大悟自己一直把概念混淆了(文章链接

首先es底层是倒排索引没错,这也是es搜索速度如此之快的原因所在

但es里的索引并不指的是倒排索引里的分词,毕竟如果把所有的分词作为索引拿到内存里搜索,那占用的资源也太大了点
可以理解为所有的分词组成了一个分词字典,为分词字典建立一个对应的索引index,将索引放到内存里,这样可以迅速找到索引,通过索引,找到分词字典,再通过倒排索引找到需要查找的数据,大大减少了IO次数,这个index才是es里的索引

这个时候可能就会有疑问,如果我只设置了指向分词字典的索引,那分词在哪设置呢?

分词是es自带的功能,如果在增加索引的时候,将字段的映射类型设置为text,并设置好es的分词器(中文一般用ik),那es会自动将该字段做好分词。就算没有提前设置好映射关系,es也会自动根据传入的数据识别后进行动态映射,非常灵活

比如我把下面的数据存入es,索引设置为order,并将customerName设置为text类型,这个时候“测试用户”可能会被分词分为:测试、用户、测试用户

"productName": "窗花",
"orderNo": "230200001",
"payAccountNo": "13",
"tradeNo": 230206000100000005,
"telephone": "13812345678",
"customerName": "测试用户"
"orgId": 1,
"amount": 4,
"gmtCreate": "2023-02-08T05:59:37.000Z",

这个时候输入“测试”去查询数据,就能匹配到这条数据

而关于是否分词,除了存储时映射选择是text还是keyword外,还可以在查询到时候选择查询方式,是mapping,还是term,具体这些细节还有很多内容,等下篇文章再仔细写吧
es的单条件查询方式和映射介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值