Elasticsearch中text与keyword的区别

Elasticsearch 文本类型与 keyword 类型的区别及使用场景
本文详细介绍了Elasticsearch中的text和keyword两种数据类型,包括它们的特点、使用场景和查询方式。text类型适用于全文搜索,如邮件内容、博客文章,会进行分词处理;keyword类型适用于精确匹配,如邮箱地址、标签,不进行分词。在更新至ES 5版本后,string类型被这两个新类型取代。在实际操作中,使用term查询keyword字段时,需注意字段名加上.keyword后缀。

1、text类型

1:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;
    2:test类型的最大支持的字符长度无限制,适合大字段存储;
使用场景:
    存储全文搜索数据, 例如: 邮箱内容、地址、代码块、博客文章内容等。
    默认结合standard analyzer(标准解析器)对文本进行分词、倒排索引。
    默认结合标准分析器进行词命中、词频相关度打分。

2、keyword

1:不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作。
2:keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。

使用场景:
存储邮箱号码、url、name、title,手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。
用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计)。
直接将完整的文本保存到倒排索引中。

3、Dynamic

dynamic属性:默认值为true,允许动态地向文档类型中加入新的字段。推荐设置为false,禁止向文档中添加字段,这样,文档类型的所有字段必须在索引映射的properties属性中显式定义,在properties字段中未定义的字段都将会ElasticSearch忽略。
dynamic设置为ture:默认值,新增加的字段被添加到索引映射中;
dynamic设置为false:新增加的字段会被忽略;
dynamic设置为strict:当向文档中新增字段时,ElasticSearch引擎抛出异常;


# index

index定义字段的分析类型以及检索方式,控制字段值是否被索引.他可以设置成 true 或者 false。没有被索引的字段将无法搜索

如果是no,则无法通过检索查询到该字段;
如果设置为not_analyzed则会将整个字段存储为关键词,常用于汉字短语、邮箱等复杂的字符串;
如果设置为analyzed则将会通过默认的standard分析器进行分析

# 集群分片

Elasticsearch 有一个硬编码限制,单个分片内的文档总数不得超过 2147483519 个。
一般来说这个限制在日志场景下是不太会触发的,但是如果做 TSDB 用,则需要多加注意!



ES更新到5版本后,取消了 string 数据类型,代替它的是 keyword 和 text 数据类型.那么 text 和keyword有什么区别呢?
# 添加数据
使用bulk往es数据库中批量添加一些document

POST /book/novel/_bulk
{"index": {"_id": 1}}
{"name": "Gone with the Wind", "author": "Margaret Mitchell", "date": "2018-01-01"}
{"index": {"_id": 2}}
{"name": "Robinson Crusoe", "author": "Daniel Defoe", "date": "2018-01-02"}
{"index": {"_id": 3}}
{"name": "Pride and Prejudice", "author": "Jane Austen", "date": "2018-01-01"}
{"index": {"_id": 4}}
{"name": "Jane Eyre", "author": "Charlotte Bronte", "date": "2018-01-02"}

# 查看mapping
发现name、author的type是text,
还有个field是keyword,keyword的type是keyword:
![](https://img2018.cnblogs.com/blog/794174/202001/794174-20200110173842134-130158795.png)

# 查询
使用term查询某个小说:

GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name": "Gone with the Wind"
}
},
"boost": 1.2
}
}
}

结果是什么也没有查到:
![](https://img2018.cnblogs.com/blog/794174/202001/794174-20200110174004507-231647388.png)


然后使用name的keyword查询:

GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name.keyword": "Gone with the Wind"
}
},
"boost": 1.2

}

}

}

 

# 总结

 text类型:会分词,先把对象进行分词处理,然后再再存入到es中。 当使用多个单词进行查询的时候,当然查不到已经分词过的内容! keyword:不分词,没有把es中的对象进行分词处理,而是存入了整个对象! 这时候当然可以进行完整地查询!默认是256个字符!

文章摘自简书,mark!

<think>好的,我现在需要回答用户关于Elasticsearchtextkeyword类型的区别及用法的问题。首先,我要确保自己正确理解这两个数据类型的核心差异和适用场景。 根据已有的知识,text类型通常用于全文搜索,而keyword类型用于精确匹配和聚合。但需要详细展开。比如,text类型会被分析器处理,分词成词项,适合搜索文本内容中的关键词。而keyword类型保持原样,适合过滤、排序或精确匹配,比如状态标签或分类ID。 接下来,我需要查阅相关的引用资料来确认这些信息是否正确。查看用户提供的引用,引用[1]和[2]主要涉及文档验证和获取源数据,可能不直接相关。引用[3]提到安全功能,可能也不相关。引用[4]关于批量更新,同样不直接涉及数据类型。不过,这些引用可能没有涵盖用户问题,因此需要依赖我的现有知识,并确保准确无误。 需要进一步确认Elasticsearch官方文档中的内容。text类型在存储时会经过分析处理,生成倒排索引,支持全文检索。而keyword类型保留原始字符串,生成doc values,适合精确匹配。例如,如果有一个“title”字段,既需要全文搜索又需要精确匹配,可能需要同时定义为textkeyword类型,即使用多字段特性。 另外,考虑举例说明。例如,用户有一个产品描述字段,使用text类型以便用户搜索关键词,如“舒适”或“透气”。而产品编号或状态(如“已发布”)应使用keyword类型,确保精确匹配。 还要注意动态映射的情况,Elasticsearch默认将字符串字段映射为textkeyword的双重类型。但最好显式定义映射以避免意外行为。 最后,总结两者的主要区别,分析处理方式、索引结构、适用场景,并给出使用建议,如何时选择哪种类型,或如何结合使用。确保回答结构清晰,分点说明,并包含实际示例帮助用户理解。</think>### Elasticsearchtextkeyword类型的区别及用法 #### 一、核心区别 1. **索引方式** - **text类型**:字段内容会被分词器(Analyzer)拆分为词项(Token),生成倒排索引。例如“Elasticsearch Guide”会被拆分为`["elasticsearch", "guide"]`,支持全文搜索[^1]。 - **keyword类型**:字段内容保持完整字符串,直接生成Doc Values结构,适用于精确匹配、聚合或排序。 2. **典型场景** - **text类型**:适合需要全文检索的字段,如文章内容、产品描述。 - **keyword类型**:适合结构化数据,如状态码(`status: "published"`)、标签(`tags: ["tech", "db"]`)或唯一标识符。 #### 二、实际应用示例 假设定义一个商品索引的映射: ```json PUT /products { "mappings": { "properties": { "name": { "type": "text", // 支持全文搜索商品名称 "fields": { "keyword": { "type": "keyword" // 同时支持精确匹配(如精确筛选) } } }, "sku": { "type": "keyword" // 商品编号需精确匹配 } } } } ``` - **查询text字段**: ```json GET /products/_search { "query": { "match": { "name": "无线耳机" // 搜索包含“无线”或“耳机”的商品 } } } ``` - **查询keyword字段**: ```json GET /products/_search { "query": { "term": { "sku": "SKU-12345" // 精确匹配商品编号 } } } ``` #### 三、常见误区建议 1. **动态映射陷阱** Elasticsearch默认将字符串字段同时映射为`text`和`keyword`(通过`.keyword`子字段)。但显式定义映射可避免不可控分析器行为。 2. **混合使用场景** 若字段需同时支持全文搜索和精确匹配,使用多字段(Multi-fields)特性,如示例中的`name.text`和`name.keyword`。 3. **性能影响** - `text`类型适合高频搜索但低频聚合的字段。 - `keyword`类型在排序和聚合时效率更高,因其直接使用Doc Values[^4]。 #### 四、高级用法 - **禁用分词**:对`text`字段设置`"index": false`可保留原始值但不分析(适用于日志原始信息存储)。 - **自定义分析器**:为`text`类型配置特定分词规则(如中文分词插件)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值