弹性搜索中的前缀自动生成字段

Prefix auto-generated field in elasticsearch

我有一份文件,里面有一些 uid。我想创建一个索引为 not_analyzed 的字段,该字段自动生成为 uid.

的 2 个字母前缀(或后缀)

有没有办法创建这样一个模板来自动计算该字段?

该用例用于显示 Kibana 上的向下采样(例如过滤器是前缀 ='00')统计信息(因此 unique count 聚合将花费更少的时间)。

我已经成功使用了它,但是我在将文档写入服务器之前在客户端创建了前缀字段。

索引前缀可以使用带有 keyword 标记器和 truncate 标记过滤器的自定义分析器构建来完成。下面是如何索引包含字段 test 的前 2 个字符的字段 test_prefix 的示例:

curl -XPUT localhost:9200/test-idx -d '{
    "settings": {
        "index": {
            "number_of_shards": 1,
            "number_of_replicas": 0
        },
        "analysis": {
            "analyzer": {
                "prefix": {
                    "tokenizer": "keyword",
                    "filter": "prefix"
                }
            },
            "filter": {
                "prefix": {
                    "type": "truncate",
                    "length": 2
                }
            }
        }
    },
    "mappings": {
        "doc": {
            "properties": {
                "test": {
                    "type": "string",
                    "copy_to": "test_prefix"
                },
                "test_prefix": {
                    "type": "string",
                    "analyzer": "prefix"
                }

            }
        }
    }
}'

我使用了 edgeNGram 分词器,似乎它提供了相同的结果。

{
  "settings": {
    "analysis": {
      "analyzer": {
        "edge_ngram_analyzer": {
          "tokenizer": "edge_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "edge_ngram_tokenizer": {
          "type": "edgeNGram",
          "min_gram": "2",
          "max_gram": "2"
        }
      }
    }
  }
}