前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两个 Elasticsearch 线上实战问题及解读

两个 Elasticsearch 线上实战问题及解读

作者头像
铭毅天下
发布2020-11-04 14:35:07
4970
发布2020-11-04 14:35:07
举报
文章被收录于专栏:铭毅天下

线上实战问题 1

1、知识点

脚本的使用

2、问题描述:

你好,我想问一下,在 ES 里我想把两个字段的值是一样的查出来。

但是其中一个字段是在一个字典里的,我该怎么写啊?

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "must": {
        "script": {
          "script": {
            "source": "doc['user_id']= doc['music.sec_uid']",
            "lang": "painless"
          }
        }
      }
    }
  }
}

比如:我想要查询 user_id 和 sec_uid 一样的数据,但是 sec_uid 是在 music 字典里。

我怎么处理呢?

3、问题分析

需求核心是:比较两个字段,把不同字段值相同的数据取出来。

这个时候,要想到传统的精准匹配搜索或者全文检索搜索都不能解决问题。

需要更高阶的搜索才可以,此时脑子里要快速过文档,当然也可以与查看文档相结合。

逐步定位文档的位置:

研读官方给出的 Demo,基本就能得到问题的答案。

这里会引申出一个非常重要的知识点,也是实战业务场景反馈最多的检索性能优化特别注意的点:

使用脚本可能会降低搜索速度。

正如官方文档解读:

  • 脚本无法利用Elasticsearch的倒排索引结构或相关优化。有时这可能会导致搜索速度降低。
  • 如果您经常使用脚本来转换索引数据,则可以通过在摄取期间(数据写入前通过 Ingest 管道方式)进行这些更改来加快搜索速度。但是,这通常意味着较慢的索引速度(数据写入速度)。

4、实战解答

代码语言:javascript
复制
PUT test_002
{
  "mappings": {
    "properties": {
      "user_id": {
        "type": "keyword"
      },
      "music": {
        "properties": {
          "sec_uid": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

GET test_002/_mapping

POST test_002/_bulk
{"index":{"_id":1}}
{"user_id":333,"music.sec_uid":444}
{"index":{"_id":2}}
{"user_id":333,"music.sec_uid":333}
{"index":{"_id":3}}
{"user_id":333,"music.sec_uid":555}


POST test_002/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "script": {
              "source":"doc['user_id']==doc['music.sec_uid']",
              "lang":"painless"
            }
          }
        }
      ]
    }
  }
}

线上实战问题 2

1、知识点

update_by_query, ingest 数据预处理 + painless 脚本的使用

2、问题描述

update脚本,某个时间字段time,都是 2020-08-10 xx:xx:xx, 如何将该字段所有值替换为2020-10-24 xx:xx:xx, 只改日期,不改时分秒。

咋写呢?求大佬们指点啊

3、问题分析

需求核心是:

  • 批量更新

脑海里里面映射出:update_by_query

  • 基于特定值的一部分更新

脑海里马上映射出:painless 脚本处理

  • 脚本实现选型

选型 1:直接 update_by_query 结合 painless

选型 2:update_by_query 结合 inges t结合 painless 脚本处理

我个人倾向于ingest,个人感觉语法相对友好。

逐步定位文档的位置:

研读官方给出的Demo,结合拆解的需求,基本就能得到问题的答案。

注意:Ingest 是后来版本的新特性,但到了7.X版本,也已经有很长时间了。大家用的少,但的确非常重要,建议要多用、常用常新!

4、实战解答(非最优解)

注意:以下是示例DSL。

代码语言:javascript
复制
PUT my_index
{
  "mappings": {
      "properties": {
        "date": {
          "type": "keyword" 
        }
    }
  }
}

PUT my_index/_doc/2
{
  "date": "2015-01-01T12:10:30Z"
}



PUT _ingest/pipeline/my_pipeline
{
  "description": "use index:my-index",
  "processors": [
    {
      "script": {
        "lang": "painless",
        "source": "ctx.data_new = ctx.date.replace('2015-01-01', '2020-01-01')"
      }
    }
  ]
}

POST my_index/_update_by_query?pipeline=my_pipeline
{
  "query":{
    "match_all":{}
  }
}

GET my_index/_search

小结

遇到问题不要慌,

拆解问题来帮忙。

拆解之后找文档,

结合文档和拆解的需求,

问题自然迎刃而解。

通过拆解问题,得到遇到类似问题的应对策略和方法论比什么都重要!

大家对问题又不同见解或者花式解法,欢迎留言交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线上实战问题 1
    • 1、知识点
      • 2、问题描述:
        • 3、问题分析
          • 4、实战解答
          • 线上实战问题 2
            • 1、知识点
              • 2、问题描述
                • 3、问题分析
                  • 4、实战解答(非最优解)
                  • 小结
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档