【ElasticSearch】ElasticSearch中字符串.keyword和.text类型区别和模糊查询

本文探讨了ES中text与keyword类型的区别,如何为text添加keyword支持,以及如何利用keyword进行精确模糊查询。重点介绍了如何在实际场景中避免分词带来的查询困扰,并提供实例说明和实用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用es对某个字符串字段进行模糊查询的时候,可能因为该字段是text类型而搜索不到,因为text类型会将字符串进行分词之后存入索引,那么我们在模糊查询的时候其实是基于已分词的词组进行的模糊查询,这样会导致本来应该查询出来的数据有可能会查询不到。所以可以通过keyword来进行精确匹配,这里记录一下对es的text和keyword的理解和使用,有不足的欢迎码友指正。

一、text和keyword类型介绍

1.ES5.0及以后的版本取消了string类型,将原先的string类型拆分为textkeyword两种类型。它们的区别在于text会对字段进行分词处理而keyword则不会进行分词。
也就是说如果字段是text类型,存入的数据会先进行分词,然后将分完词的词组存入索引,而keyword则不会进行分词,直接存储。

2.text类型的数据被用来索引长文本,例如电子邮件主体部分或者一款产品的介绍,这些文本会被分析,在建立索引文档之前会被分词器进行分词,转化为词组。经过分词机制之后es允许检索到该文本切分而成的词语,但是text类型的数据不能用来过滤、排序和聚合等操作。
keyword类型的数据可以满足电子邮箱地址、主机名、状态码、邮政编码和标签等数据的要求,不进行分词,常常被用来过滤、排序和聚合。

3.当我保存一个字符串字段时,es自动生成的该字段的mapping是text + keyword(es版本7.9.0)。
在这里插入图片描述
4.当我想要不分词进行查询的时候,可以加上.keyword进行查询,比如:

"term": {
    "name.keyword": "测试名称"
}

二、给text类型添加keyword

如果在创建index的时候给某个字段指定了类型text,但是之后又想给它追加上keyword以便按完整字符串搜索。可以通过PUT命令实现。
使用命令:

PUT /user_index/_mapping
{
  "properties":{
    "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
  }
}

添加前:
在这里插入图片描述

添加后:
在这里插入图片描述
使用GET /user_index/_mapping/查看index的mapping

三、模糊查询

https://blog.csdn.net/pony_maggie/article/details/113951893

### Elasticsearch 中 `keyword` `text` 类型区别及用法 #### 定义与用途 在 Elasticsearch 中,字段可以被定义为不同的数据类型来优化存储查询性能。两种常见的字符串类型是 `text` `keyword`。 - **Text 字段**用于全文本搜索。当一个字段被映射为 `text` 类型时,在索引过程中会对其进行分词处理,即通过分析器将其分解成多个独立的词条以便于后续检索操作。这种类型的字段适合用来保存文章正文、描述等内容[^1]。 - **Keyword 字段**则不会经历上述复杂的预处理流程;相反,整个输入串会被视为单一单元并原样存入倒排表中。因此,这类字段非常适合那些不需要进行复杂自然语言解析而只需精确匹配的情况,比如用户名、状态码等固定格式的数据项[^2]。 #### 映射示例 为了更好地理解这两种类型的应用场景,下面给出一段创建包含两者在内的索引模板代码: ```json PUT /my_index { "mappings": { "properties": { "title": { "type": "text", "fields": { "keyword": { "type": "keyword" } } }, "status_code": { "type": "keyword" } } } } ``` 在此例子中,“title”既作为可分割的文字流又作为一个整体关键字存在,允许灵活运用不同方式对该属性执行查找动作。“status_code”,由于其特性决定了只可能采取确切值对照的形式,则单纯指定为关键词即可满足需求[^3]。 #### 查询差异 针对上面建立好的结构化信息模型,假设现在要实现如下两个业务逻辑: - 查找所有标题中含有特定单词的文章; - 统计每种HTTP响应状态出现次数。 对于前者而言,显然应该利用到 `match` 或者更高级别的布尔组合策略作用于 `title.text` 上面去达成目的;而对于后者来说,鉴于统计任务往往依赖聚合框架完成,那么直接对 `status_code.keyword` 发起terms请求便是最恰当的选择了[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值