有没有一种方法可以将属性类型定义为ElasticSearch Array数据类型中的关键字?

时间:2019-01-30 02:52:26

标签: elasticsearch search aws-elasticsearch

我正在为大型数据集建立索引,该数据集具有特定实体的多个名称字段。我已经定义了类型数组的名称字段,并在其中添加了大约4个名称。其中一些名称之间有空格,并且它们已被标记化。我可以避免吗?

我知道对于String我们在Elastic中既有文本又有关键字类型,但是当我将数组作为数据类型时如何将类型定义为关键字?默认情况下,所有数组字段均作为文本类型。我希望将它们视为关键字类型,以使它们在编制索引时不会被标记化。

预期:如果我将“ Hello World”存储在数组中,则应该可以搜索“ Hello World”。

当前行为:令牌化时,它存储的Hello和World都不一样。

1 个答案:

答案 0 :(得分:1)

弹性搜索中没有数组的数据类型。每当您将数组作为 x 类型的属性的值发送时,该属性就会变成仅接受 x 类型的值的数组。

例如,您创建了一个如下属性:

{
   "tagIds": {
      "type": "integer"
   }
}

然后使用以下值索引文档:

{
   "tagIds": [124, 452, 234]
}

然后tagIds自动成为整数数组。

对于您的情况,您要做的就是创建一个字段name,类型为keyword。并确保始终将数组传递给此字段,即使该字段必须保留单个值以确保它始终是数组也是如此。以下是您需要的: 映射:

PUT test
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "keyword"
        }
      }
    }
  }
}

索引文档:

PUT test/_doc/1
{    
    "name" : ["name one"]
}