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"
}
}
}
综上所述,这种将字段同时定义为 text 和 keyword 类型的设计是为了满足多样化的查询需求,是一种灵活且有效的 Elasticsearch 映射策略。
精准匹配
"operation_id" : {
"type" : "keyword"
}
keyword 类型:operation_id 字段直接定义为 keyword 类型。这意味着该字段的值不会被分词,会被作为一个整体进行存储和索引。适用于需要精确匹配的场景,例如根据操作 ID 来查找特定的操作记录。

浙公网安备 33010602011771号