elasticsearch的keyword与text的区别

本文探讨了Elasticsearch中keyword与text字段的区别,重点在于它们如何影响索引建立与搜索过程,特别是针对中文分词的应用。

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

es2.*用户可忽略该文章。es 2.*版本里面是没有这两个字段!!!

当初接触es,最惊讶就是他的版本速度发布太快,这次主要讨论keyword与text的区别

在es 2.*版本里面是没有这两个字段,只有string字段。

5.*之后,把string字段设置为了过时字段,引入text,keyword字段

这两个字段都可以存储字符串使用,但建立索引和搜索的时候是不太一样的

keyword:存储数据时候,不会分词建立索引

text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)。

"maker":
    {"type":"keyword","index":"false"},
"name":
    {"type":"text","index":"true","boost":"5","analyzer":"ik_max_word","search_analyzer":"ik_max_word"},

现在我建立两个字段:

    maker制作人是keyword类型

    name名称是text类型

我现在分别往两个字段里面存储数据,maker存储 “张三李四”,name存储 “墙体钢结构”、

其实在存储的过程中maker 没有分词,只是存储了一个张三李四,而name字段存储倒排索引的时候进行了分词 墙体 和 钢结构或者是墙体 钢 结构。

这样在查询的时候,这两个字段的区别就表现出来了

如果精确查找name字段

{
    "query": {
        "term": {
            "name": "墙体钢结构"
        }
    }
}

会出现空数据,表示查不到数据,这是因为墙体钢结构这个值在存储的时候被分词了,倒排索引里面只有‘墙体’,'钢结构',这两个词所以会出现查找为空的记录

        这种情况下的分词是存储数据时候的分词,还有一种分词是在你搜索的时候根据你的搜索参数进行分词后再进行搜索的。es提供了许多开箱即用的分析器analyzer,大家也可以去下载被人开发好的分词器然后安装在es的plugins下,然后在声明使用。现在name这个字段我用的是ik的分词器,是一个大家基本都会用到的中文分词器,git地址为 https://github.com/medcl/elasticsearch-analysis-ik。

如果精确查找maker字段

{
    "query": {
        "term": {
            "marker": "张三李四"
        }
    }
}

这时候这条记录是存在的,因为keyword字段不会进行分词。

这查询是精确查询出现的结果,如果你使用分词查询,结果就会一样,但搜索结构的权重是不一样的。具体区别大家可以自己上去实验。

### 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]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东境物语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值