elasticsearch 可搜索的合成字段

5lwkijsr  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(181)

假设在源文档(JSON)中存在两个名为ab的字段,它们的类型为long,我想通过用下划线连接前面字段的值来构造一个合成字段(例如c),并将其索引为keyword
也就是说,我正在研究一个可以用想象的、部分的Map来支持的特征,如下所示:

...

  "a": { "type": "long" },
  "b": { "type": "long" },
  "c": {
    "type": "keyword"
    "expression": "${a}_${b}" 
  },
...

**注意:**上面的Map只是为了示例而创建的。它是无效的!

所以我在寻找的是,elasticsearch中是否有一个特性,一个配方或者提示来支持这个需求。这个字段不需要在_source中注册,只需要是可搜索的。

lx0bsm1f

lx0bsm1f1#

这需要两个步骤--一个dynamic_mapping和一个ingest_pipeline
我假设您的字段c是非平凡的,因此您可能希望使用match在动态模板中匹配该字段,并将keywordMap分配给它:

PUT synthetic
{
  "mappings": {
    "dynamic_templates": [
      {
        "c_like_field": {
          "match_mapping_type": "string",
          "match":   "c*",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ],
    "properties": {
      "a": {
        "type": "long"
      },
      "b": {
        "type": "long"
      }
    }
  }
}

然后,您可以建立一个管道,将您的ab连接起来:

PUT _ingest/pipeline/combined_ab
{
  "description" : "Concatenates fields a & b",
  "processors" : [
    {
      "set" : {
        "field": "c",
        "value": "{{_source.a}}_{{_source.b}}"
      }
    }
  ]
}

摄取新文档后(使用激活的管道!)

POST synthetic/_doc?pipeline=combined_ab
{
  "a": 531351351351,
  "b": 251531313213
}

我们准备好了:

GET synthetic/_search

收益率

{
  "a":531351351351,
  "b":251531313213,
  "c":"531351351351_251531313213"
}

验证是否也使用GET synthetic/_mapping

相关问题