【问题标题】:Filter field value of a document while inserting into elastic search index插入弹性搜索索引时过滤文档的字段值
【发布时间】:2022-01-17 16:23:34
【问题描述】:

我有一个简单的要求,我需要创建一个模板,该模板将在将字段的值插入 Elastic 搜索索引之前对其进行过滤。

弹性搜索版本:7.10.2

示例:我创建了一个如下所示的模板。

PUT /index_test
{
  "mappings": {
    "properties": {
    "id": {
        "type": "keyword"
       
      },
    "id_type": {
        "type": "keyword"
      }
    }
  }
}

但是,我想将 id_type 的值过滤为“social”,然后才应该将这个文件插入到文档中,否则应该只插入 id 或其他字段(将来)。

我试图探索 fieldData 选项,但它不访问该值,而是取真或假。没想到。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用ingest pipeline 执行此操作,该ingest pipeline 将在索引文档之前过滤值。

    首先,创建一个管道,如果 id_type 字段不满足给定条件,它将删除它:

    PUT _ingest/pipeline/type-filter
    {
      "description": "Filter the id_type field",
      "processors": [
        {
          "remove": {
            "if": "ctx.id_type != 'social'",
            "field": "id_type"
          }
        }
      ]
    }
    

    然后,在为您的文档编制索引时,您可以参考这个摄取管道,以便所有文档在被索引之前都必须经过它。

    PUT index_test/_doc/1?pipeline=type-filter
    {
       "id": "123",
       "id_type": "social"       <--- this field will be indexed
    }
    
    PUT index_test/_doc/1?pipeline=type-filter
    {
       "id": "456",
       "id_type": "anything"     <--- this field won't be indexed
    }
    

    【讨论】:

    • 可以看到它的工作,谢谢。但想了解这种方法的性能。因为这是一个流式应用程序,每秒处理近 5 万条记录。无论如何,这条管道会花费它吗?
    • 由于这是一个流式应用程序,如果您可以在流的上游进行此检查/处理,那就更好了。如果没有,我认为这个额外的管道可以忽略不计,因为它没有进行任何繁重的处理。
    • 好的,谢谢。将其用于性能运行并在此处更新以供将来参考。感谢您的快速回复:)。
    • 能否请您帮助我提供等效的 java 参考资料,我正在尝试推送批量文档并且正在流水线中。
    • 当然可以,但是由于这个问题已经结束并且这涉及到另一个问题,请随时根据新要求提出一个新问题,这样我们就不会在这个问题上塞得太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2015-12-18
    • 2018-08-26
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多