Elasticsearch keyword、constant_keyword和wildcard类型的用法(附带实例)
Elasticsearch 关键词家族的数据类型包括 keyword、constant_keyword 和 wildcard。
在 Elasticsearch 中,这种结构化数据被表示为 keyword 数据类型。
keyword 数据类型保持字段不变。字段不会被分词或分析。keyword 类型的字段的优点在于可以用于数据聚合、范围查询及对数据的过滤和排序操作。要设置 keyword 类型,可使用以下格式:
假设英国在 2031 年进行人口普查,显然每个公民的普查文档的 country 字段都默认是"United Kingdom"。当将这些文档写入 census 索引时,没有必要为每个文档都设置 country 字段。
下面实例中的映射模式定义了一个索引 census,其中有一个名为 country 的字段,类型为 constant_keyword。
注意,在声明映射定义时,我们将这个字段的默认值设置为"United Kingdom"。现在我们为 John Doe 索引一个文档,只包含他的名字(没有 country 字段):
当我们搜索英国的所有居民时,尽管 John 的文档在索引时没有设置该字段,但我们仍然收到了返回 John 文档的正向结果:
我们可以通过在映射定义中声明 "type":"wildcard" 来将字段定义为 wildcard 类型。然后,通过发出 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*" ←--- 使用通配符搜索 } } } }关键词类型的字段高效且性能良好,因此适当使用它们可以提高索引和搜索查询的性能。