Elasticsearch 可搜索合成字段

yan*_*isf 3 elasticsearch

假设在源文档 (JSON) 中存在几个名为a和的字段b,它们的类型为long,我想c通过将先前字段的值与下划线连接起来并将其索引为来构造一个合成字段(例如)keyword

也就是说,我正在研究一个可以通过想象的、部分的、像这样的映射来支持的功能:

...

  "a": { "type": "long" },
  "b": { "type": "long" },
  "c": {
    "type": "keyword"
    "expression": "${a}_${b}" 
  },
...
Run Code Online (Sandbox Code Playgroud)

注意:上面的映射只是为了示例而制作的。这是无效的!

所以我正在寻找的是,elasticsearch 中是否有一个功能,支持这个要求的配方或提示。该字段无需在 中注册_source,只需可搜索即可。

Joe*_*ook 6

有 2 个步骤 - adynamic_mapping和 an ingest_pipeline

我假设您的字段c非常重要,因此您可能希望使用 a 匹配动态模板中的该字段match 并将keyword映射分配给它:

PUT synthetic
{
  "mappings": {
    "dynamic_templates": [
      {
        "c_like_field": {
          "match_mapping_type": "string",
          "match":   "c*",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ],
    "properties": {
      "a": {
        "type": "long"
      },
      "b": {
        "type": "long"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以设置一个管道来连接你的a& b

PUT _ingest/pipeline/combined_ab
{
  "description" : "Concatenates fields a & b",
  "processors" : [
    {
      "set" : {
        "field": "c",
        "value": "{{_source.a}}_{{_source.b}}"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

POST synthetic/_doc?pipeline=combined_ab
{
  "a": 531351351351,
  "b": 251531313213
}
Run Code Online (Sandbox Code Playgroud)

我们很高兴:

GET synthetic/_search
Run Code Online (Sandbox Code Playgroud)

产量

{
  "a":531351351351,
  "b":251531313213,
  "c":"531351351351_251531313213"
}
Run Code Online (Sandbox Code Playgroud)

也验证一下GET synthetic/_mapping