ES创建索引语法

兼顾全文搜索与精确匹配

"create_by" : {
    "type" : "text",
    "fields" : {
        "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
        }
    }
} 

在 Elasticsearch 里,像 "create_by" 这样既定义为 text 类型又通过 fields 子字段定义为 keyword 类型的做法是一种常见且合理的设计,不存在问题,反而具备诸多优势,下面为你详细分析。

设计目的和优势

1. 兼顾全文搜索与精确匹配

  • text 类型text 类型主要用于全文搜索。当你将一个字段定义为 text 类型时,Elasticsearch 会使用分词器对输入的文本进行分词处理。例如,若 create_by 字段的值为 "John Doe",分词后可能变为 "John""Doe"。这样在执行全文搜索时,你可以使用 match 查询,通过搜索 "John" 或者 "Doe" 来找到包含该值的文档。
{
    "query": {
        "match": {
            "create_by": "John"
        }
    }
}
  • keyword 子字段keyword 类型用于精确匹配和排序。create_by.keyword 子字段将整个输入值作为一个整体进行存储和索引,不会进行分词处理。这在需要精确匹配完整值的场景中非常有用,比如根据完整的用户名来筛选记录。
{
    "query": {
        "term": {
            "create_by.keyword": "John Doe"
        }
    }
}

2. 满足不同业务需求

在实际的业务场景中,对于某些字段可能既需要进行全文搜索,也需要进行精确匹配。以用户姓名为例,用户可能想要搜索包含某个姓名片段的所有记录,也可能需要精确查找某个特定用户的记录。通过这种设计,一个字段就能同时满足这两种需求。

3. 提高排序和聚合性能

在进行排序和聚合操作时,keyword 类型比 text 类型更合适。因为 text 类型经过分词后,难以直接用于排序和聚合,而 keyword 类型存储的是完整的原始值,能够高效地支持这些操作。

ignore_above 参数的作用

ignore_above 参数设置为 256 意味着如果 create_by.keyword 字段的值长度超过 256 个字符,Elasticsearch 将忽略该值,不进行索引。这样可以避免索引过长的字符串,节省存储空间和提高索引性能。

示例代码

以下是一个简单的示例,展示如何创建包含这种映射的索引,并进行不同类型的查询:

// 创建索引并定义映射
PUT my_index
{
    "mappings": {
        "properties": {
            "create_by": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}

// 插入文档
POST my_index/_doc
{
    "create_by": "John Doe"
}

// 全文搜索
GET my_index/_search
{
    "query": {
        "match": {
            "create_by": "John"
        }
    }
}

// 精确匹配
GET my_index/_search
{
    "query": {
        "term": {
            "create_by.keyword": "John Doe"
        }
    }
}

综上所述,这种将字段同时定义为 textkeyword 类型的设计是为了满足多样化的查询需求,是一种灵活且有效的 Elasticsearch 映射策略。

精准匹配

"operation_id" : {
    "type" : "keyword"
}

keyword 类型:operation_id 字段直接定义为 keyword 类型。这意味着该字段的值不会被分词,会被作为一个整体进行存储和索引。适用于需要精确匹配的场景,例如根据操作 ID 来查找特定的操作记录。

posted @   向着朝阳  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示