改变es的text的type为keyword

ElasticSearch中text和keyword类型的区别及text类型添加keyword
2019-07-26 11:06:45 qq_775879106 阅读数 199更多
分类专栏: es
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/qq_36245532/article/details/97374705
在ES的2.X版本中,对于字符类型的数据,我们都使用string类型作为映射,然后再设置它的分词,例如我们新建了一个名为 zk_test的索引,类型为 info,为其中字符类型的name字段设置索引,设置不分词,Kibanan中操作如下

PUT /zk_test/info/_mapping
{
“info”:{
“properties”:{
“name”:{“type”:“string”,“index”:“not_analyzed”},
“age”:{“type”:“integer”}
}
}

但是在ES5.6.8中这样操作,虽然操作会成功,但是ES会提醒你,string类型已经过期,请使用 text或keyword类型设置name字段

text和keyword这两个类型,是在5以后的版本中出现的。官网中,对这两个数据类型,这样描述

Text datatype:
A field to index full-text values, such as the body of an email or the description of a product. These fields are analyzed, that is they are passed through an analyzer to convert the string into a list of individual terms before being indexed. The analysis process allows Elasticsearch to search for individual words within each full text field. Text fields are not used for sorting and seldom used for aggregations (although the significant text aggregation is a notable exception).

If you need to index structured content such as email addresses, hostnames, status codes, or tags, it is likely that you should rather use a keyword field.

Keyword datatype
A field to index structured content such as email addresses, hostnames, status codes, zip codes or tags.
They are typically used for filtering (Find me all blog posts where status is published), for sorting, and for aggregations. Keyword fields are only searchable by their exact value.

If you need to index full text content such as email bodies or product descriptions, it is likely that you should rather use a text field.
官方文档链接:text keyword

原来,es从2.X版本一下子跳到了5.X版本,将string类型变为了过期类型,取而代之的是text和keyword数据类型,一直到现在最新的6以上版本。接下来就看看这两个字段的区别。

 按照官方文档的阐述,text类型的数据被用来索引长文本,例如电子邮件主体部分或者一款产品的介绍,这些文本会被分析,在建立索引文档之前会被分词器进行分词,转化为词组。经过分词机制之后es允许检索到该文本切分而成的词语,但是text类型的数据不能用来过滤、排序和聚合等操作。
keyword类型的数据可以满足电子邮箱地址、主机名、状态码、邮政编码和标签等数据的要求,不进行分词,常常被用来过滤、排序和聚合。
综上,可以发现text类型在存储数据的时候会默认进行分词,并生成索引。而keyword存储数据的时候,不会分词建立索引,显然,这样划分数据更加节省内存。

这样,我们映射了某一个字段为keyword类型之后,就不用设置任何有关分词器的事情了,该类型就是默认不分词的文本数据类型。而对于text类型,我们还可以设置它的分词类型,如下:

PUT /zk_test/info/_mapping
{
“info”:{
“properties”:{
“address”:{“type”:“text”,“analyzer”:“standard”}
}
}
}
analyzer 还有中文分词 chinese,英文分词 english 等参数。

另外,我们在像之前2.X版本中一样设置分词使用"index":"not_analyzed"配置时,会有提醒,提示"index"参数只有false和true两个值。

在5以上的版本中,“index”参数用来配置该字段是否可以被用来搜索,true可以通过搜索该字段检索到文档,false为否,配置分词器,用analyzer参数。

text 类型添加keywork

添加前

“userNickName”: {
“type”: “text”
}
PUT添加语句

PUT user_index/user_type/_mapping
{
“properties”: {
“userNickName”: {
“type”: “text”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
}
}
}
}
添加后

“userNickName”: {
“type”: “text”,
“fields”: {
“keyword”: {
“type”: “keyword”,
“ignore_above”: 256
}
}
}

<think>好的,我现在需要回答用户关于Elasticsearch中textkeyword类型的区别及用法的问题。首先,我要确保自己正确理解这两个数据类型的核心差异和适用场景。 根据已有的知识,text类型通常用于全文搜索,而keyword类型用于精确匹配和聚合。但需要详细展开。比如,text类型会被分析器处理,分词成词项,适合搜索文本内容中的关键词。而keyword类型保持原样,适合过滤、排序或精确匹配,比如状态标签或分类ID。 接下来,我需要查阅相关的引用资料来确认这些信息是否正确。查看用户提供的引用,引用[1]和[2]主要涉及文档验证和获取源数据,可能不直接相关。引用[3]提到安全功能,可能也不相关。引用[4]关于批量更新,同样不直接涉及数据类型。不过,这些引用可能没有涵盖用户问题,因此需要依赖我的现有知识,并确保准确无误。 需要进一步确认Elasticsearch官方文档中的内容。text类型在存储时会经过分析处理,生成倒排索引,支持全文检索。而keyword类型保留原始字符串,生成doc values,适合精确匹配。例如,如果有一个“title”字段,既需要全文搜索又需要精确匹配,可能需要同时定义为textkeyword类型,即使用多字段特性。 另外,考虑举例说明。例如,用户有一个产品描述字段,使用text类型以便用户搜索关键词,如“舒适”或“透气”。而产品编号或状态(如“已发布”)应使用keyword类型,确保精确匹配。 还要注意动态映射的情况,Elasticsearch默认将字符串字段映射为textkeyword的双重类型。但最好显式定义映射以避免意外行为。 最后,总结两者的主要区别,分析处理方式、索引结构、适用场景,并给出使用建议,如何时选择哪种类型,或如何结合使用。确保回答结构清晰,分点说明,并包含实际示例帮助用户理解。</think>### Elasticsearch中textkeyword类型的区别及用法 #### 一、核心区别 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`类型配置特定分词规则(如中文分词插件)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值