首页 > 编程笔记 > 通用技能 阅读:3

Elasticsearch keyword、constant_keyword和wildcard类型的用法(附带实例)

Elasticsearch 关键词家族的数据类型包括 keyword、constant_keyword 和 wildcard。

keyword类型

结构化数据,如 PIN 码、银行账户和电话号码,不需要进行部分匹配搜索或者生成相关结果。结果往往只提供两种输出:如果匹配就返回结果,否则不返回结果。这类查询不关心文档的匹配程度,所以不期望结果有相关性分数。

在 Elasticsearch 中,这种结构化数据被表示为 keyword 数据类型。

keyword 数据类型保持字段不变。字段不会被分词或分析。keyword 类型的字段的优点在于可以用于数据聚合、范围查询及对数据的过滤和排序操作。要设置 keyword 类型,可使用以下格式:
"field_name":{ "type": "keyword" }
例如,下面的实例创建了一个 keyword 数据类型的 email 字段:
PUT faculty
{
  "mappings": {
    "properties": {
      "email": {  ←---  定义email字段
        "type": "keyword"  ←---  将email声明为keyword类型
      }
    }
  }
}
我们也可以将数值声明为 keyword 类型。例如,将 credit_card_number 声明为 keyword 类型而不是 long 等数值类型,以提高访问效率。无法在这种数据上构建 range 查询。经验法则是,如果数值字段不是用在 range 查询中,建议将其声明为 keyword 类型,因为这样可以加快检索速度。

constant_keyword类型

当文档语料库预期具有相同值时,无论数量如何,constant_keyword 类型都非常有用。

假设英国在 2031 年进行人口普查,显然每个公民的普查文档的 country 字段都默认是"United Kingdom"。当将这些文档写入 census 索引时,没有必要为每个文档都设置 country 字段。

下面实例中的映射模式定义了一个索引 census,其中有一个名为 country 的字段,类型为 constant_keyword。
PUT census
{
  "mappings": {
    "properties": {
      "country":{
        "type": "constant_keyword",
        "value":"United Kingdom"
      }
    }
  }
}

注意,在声明映射定义时,我们将这个字段的默认值设置为"United Kingdom"。现在我们为 John Doe 索引一个文档,只包含他的名字(没有 country 字段):
PUT census/_doc/1
{
  "name":"John Doe"
}

当我们搜索英国的所有居民时,尽管 John 的文档在索引时没有设置该字段,但我们仍然收到了返回 John 文档的正向结果:
GET census/_search
{
  "query": {
    "term": {
      "country": {
        "value": "United Kingdom"
      }
    }
  }
}
constant_keyword 类型的字段在该索引的每个文档中都具有完全相同的值。

wildcard类型

wildcard 数据类型是属于关键词家族的另一种专用数据类型,它支持使用通配符和正则表达式搜索数据。

我们可以通过在映射定义中声明 "type":"wildcard" 来将字段定义为 wildcard 类型。然后,通过发出 wildcard 查询来查询该字段,实例代码如下:
GET errors/_search
{
  "query": {
    "wildcard": {  ←---  使用wildcard查询
      "description": {
        "value": "*obj*"  ←---  使用通配符搜索
      }
    }
  }
}
关键词类型的字段高效且性能良好,因此适当使用它们可以提高索引和搜索查询的性能。

相关文章