es字符串类型string、text、keyword与分词

ElasticSearch 5.x以上版本用text和keyword取代string类型。text用于全文索引,会分词;keyword不分词,用于过滤。新版本字符串默认同时映射成这两种类型,可分别实现全文搜索和关键词搜索及数据聚合,还给出了相应查询示例。

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

ElasticSearch5.x以上版本使用text和keyword作为字符串类型取代之前版本的string类型。

字符串 - text:用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引

字符串 - keyword:不分词,只能搜索该字段的完整的值,只用于 filtering

 

新版本字符串将默认被同时映射成textkeyword类型. 例如对下面的文档进行索引后:

{

    "nameZh": "风2"

}

 

ElasticSearch将会为你创建下面的动态映射(dynamic mappings):

{

    "nameZh": {

        "type""text",

        "fields": {

            "keyword": {

                "type""keyword",

                "ignore_above": 256

            }

        }

    }

}

当然, 基于这个映射你即可以在foo字段上进行全文搜索, 也可以通过foo.keyword字段实现关键词搜索及数据聚合.

{
    "query": {
        "bool": {
            "should": [{
                    "match_phrase": {
                        "country": "丝"
                    }
                },
                {
                    "term": {
                        "nameZh.keyword": "风2"
                    }
                }
            ],
            "minimum_should_match": 1

        }

    }
}

"country": "丝" 分词查询走text    "nameZh.keyword": "风2"不分词查询 走keyword

 

<think>嗯,用户想要在Logstash中配置Elasticsearch索引,让默认分词器使用keyword类型。首先,我需要回忆一下Elasticsearch的默认分词器是什么。对了,默认是standard分词器,会把文本按空格等分成词汇,但用户希望整个字段作为整体处理,比如不分词,直接作为keyword。 那Logstash如何配置索引设置呢?记得Logstash在同步数据时会自动创建索引,但默认情况下可能不会使用自定义的分词器。所以用户需要修改Logstash的配置,使其在创建索引时指定默认分词器为keyword。 这时候可能需要用Logstash的模板功能。模板可以在索引创建时应用特定的设置和映射。比如,在模板中定义mappings,将字段的默认分词器设为keyword。但具体步骤是怎样的呢? 根据引用中的内容,引用3提到有两种方式:手动创建索引,或者使用Logstash的自定义模板。用户希望自动配置,所以应该用Logstash的自定义模板方法。需要在Logstash的配置文件中添加template部分,指定索引的模式,并定义mappings中的dynamic_templates,将字符串字段的默认类型设为keyword。 不过要注意,Elasticsearch中的text类型通常会有一个keyword子字段,但用户可能希望所有字符串字段默认都是keyword类型,这样就不会被分词。所以需要在模板中设置dynamic_templates,匹配所有字符串,将其映射为keyword类型。 另外,还要确保在模板中指定了索引的settings,可能不需要更改分词器,因为keyword类型本身不需要分词。但需要确认索引的默认分析器是否影响,不过如果是字段类型设为keyword分词器设置可能不是必须的。 然后,用户需要将Logstash的配置文件(比如logstash.conf)中的output部分添加template和template_name等参数,指向自定义的模板文件。模板文件需要包含正确的JSON结构,定义索引的mappings,覆盖所有字符串字段为keyword。 可能还需要测试一下配置是否正确,比如通过发送数据后检查索引的mapping,确认字段类型是否是keyword,以及是否被正确分析。比如使用_analyze API来测试,如引用4中的例子,确保字段没有被分词。 总结步骤应该是:创建自定义模板文件,配置Logstash使用该模板,并在模板中定义dynamic_templates将所有字符串字段设为keyword类型。然后重启Logstash,让新配置生效,之后创建的索引就会应用这个模板,所有字符串字段默认使用keyword类型,不分词。</think>### 分步解决方案 1. **创建自定义索引模板** 在Logstash配置文件中定义模板,覆盖字符串字段的默认分词行为: ```ruby output { elasticsearch { hosts => ["localhost:9200"] index => "your_index_name" template => "/path/to/custom_template.json" # 自定义模板路径 template_name => "custom_template" # 模板名称 template_overwrite => true # 覆盖同名模板 } } ``` 2. **配置模板文件`custom_template.json`** 在模板中设置`dynamic_templates`,强制所有字符串类型字段默认使用`keyword`类型: ```json { "index_patterns": ["your_index_pattern*"], // 匹配的索引名称模式 "settings": { "index": { "analysis": { ... } // 可选,若无需特殊分词器可不配置 } }, "mappings": { "dynamic_templates": [ { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "keyword" // 将字符串字段设为keyword类型 } } } ] } } ``` 3. **验证配置效果** 通过以下步骤检查字段是否应用`keyword`类型: ```bash # 查看索引mapping GET your_index_name/_mapping # 测试分词效果(应返回未分词的原始内容) POST your_index_name/_analyze { "field": "your_field", "text": "example-text" } ``` ### 关键概念说明 - **`keyword`类型**:字段值作为整体处理,不进行分词,适合精确匹配[^1]。 - **动态模板**:根据字段数据类型或名称自动匹配映射规则[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值