商品ElasticSearch的查询改造

本文讲述了在数据库慢查询问题日益严重的情况下,如何利用Elasticsearch进行商品查询改造,特别是针对like %%的模糊查询。文章讨论了Elasticsearch的wildcard操作、分词查询的权衡、路由策略选择、索引结构设计以及数据同步等问题,旨在提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

商品ElasticSearch的查询改造

需求

因数据库慢查询越来越多,很多慢查询已经到了无法优化的地步(覆盖的量很大)并且索引已经设计到极限,例如按照时间进行索引的,时间平均分布的,所以索引命中很多数据。无法有效过滤大量的条数。所以进行改造,商品的模糊查询是 like %%的操作,所以导致数据库查询时间较长。

操作

现需要对商品name进行模糊查询的操作转移到Elasticsearch中,采用elasticsearch中的 wildware的操作来进行,其实这个操作也是扫描很多字段,但是可以减少数据库慢查询,但是这个通配符匹配也是所有数据进行查询,理论上来说没有达到优化的效果。可认为是解决数据库慢查询的一个方式。

展望

未来模糊查询应该会被代替,使用分词进行查询,将字段设置为可以分词的字段,使用对应的关键字进行检索,就可以提高查询速度。

需要解决的问题

1.数据量很大的时候需要按照一定的内容建立索引
2.路由策略的选取,因为现在我们的路由策略是es默认的路由策略,可以平均分布,但是可能我们要查询的内容分布在不同的分片上面,这个时候,我们就要费力气,比如一个卖家的商品只需要查询一个分片就可以查询出来,但是现在我们却要查询多个分片,导致时间和空间的浪费。未来修改路由策略也可以减少很多时间空间的浪费。
3.分词的选取,模糊搜索的好处是 与词义无关,这样不管用户输入什么词组都可以查询出对应的内容,但是使用分词器后,会对字段进行分词,这个时候 输入与词义无关的情况的时候就会出现查询不出来的问题。例如NIKE鞋 这个本身是一个词,但是用户搜索IKE谢的时候却无法搜索出来。要解决这种事情,目前没有好的办法,要速度还是精确匹配,要有一定的取舍(例如在JD的搜索框内搜索,联想笔记本就可以搜索出很多相关的内容,但是搜索记本的时候 相关度就有所下降,但是jd 提供了一个子查询的内容,可以通过子查询查询出对应的内容!)

操作查询ES:

Flush

这个程序用来进行初始化数据来使用。我们建立索引后,要将数据库的数据导入到ES中,这个时候可以使用这个程序进行跑数据,将数据库的数据跑到es里面。

collector

这个程序用来监听商品的变更日志,来更新es中的数据,更新状态等操作。

searcher

这个服务主要用来查询ES的数据。一个es的查询客户端

目前创建了Elasticsearch的索引结构

POST http://127.0.0.1:9200/product_info_extends/
{
   "mappings": {
      "product_info_extends": {
         "properties": {
            "sendProvinceId": {
               "type": "long"
            },
            "imgKey": {
               "type": "string",
               "index": "no"
            },
            "noFree": {
               "type": "string",
               "index": "not_analyzed"
            },
            "score": {
               "type": "long"
            },
            "type": {
               "type": "long"
            },
            "promotionId": {
               "type": "string",
               "index": "not_analyzed"
            },
            "auditType": {
               "type": "long"
            },
            "taourl": {
               "type": "string",
               "index": "no"
            },
            "level": {
               "type": "string",
               "index": "not_analyzed"
            },
            "firstPostPrice": {
               "type": "long"
            },
            "offlinePermission": {
               "type": "string",
               "index": "no"
            },
            "productSku": {
               "type": "string",
               "index": "no"
            },
            "promotionEdt": {
               "null_value": 0,
               "format": "basic_date_time",
               "type": "date",
               "doc_values": true
            },
            "shelf": {
               "type": "string",
               "index": "no"
            },
            "offlineTime": {
               "null_value": 0,
               "format": "basic_date_time",
               "type": "date",
               "doc_values": true
            },
            "stockSku": {
               "type": "string",
               "index": "no"
            },
            "createUserId": {
               "type": "long"
            },
            "sellerSendtime": {
               "type": "long"
            },
            "mntProductNum": {
               "type": "string",
               "index": "not_analyzed"
            },
            "lastPromotionSdt": {
               "null_value": 0,
               "format": "basic_date_time",
               "type": "date",
               "doc_values": true
            },
            "lastPromotionEdt": {
               "null_value": 0,
               "format": "basic_date_time",
               "type": "date",
               "doc_values": true
            },
            "productSnapshootId": {
               "type": "string",
               "index": "not_analyzed"
            },
            "offlineTy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值