es中的数据类型

字符串

文本(Text)
  1. 作用:适用于全文搜索的文本字段,例如文章内容、电子邮件正文、产品描述等长文本。
  2. 特点:ES会对文本内容进行分词处理,将字符串转换为单个术语的列表,支持全文搜索和模糊查询。但通常不用于排序或聚合
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "description": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}
我有一辆汽车
我有
一辆汽车
汽车
车
我
关键字(Keyword)
  1. 作用:适用于精确匹配的字段,例如名称、标签、用户ID、电子邮件地址、状态码等短文本。
  2. 特点:不会对字段内容进行分词处理,直接构建倒排索引,适合精确查询、过滤、排序和聚合操作
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "email": {
        "type": "keyword"
      }
    }
  }
}
Text和Keyword类型比较
  1. 存储方式:Text类型字段会被分析器处理,分解成词元并存储在倒排索引中;Keyword类型字段则保持原样存储。
  2. 搜索方式:Text类型支持全文搜索,包括模糊查询和前缀查询;Keyword类型支持精确匹配和聚合。
  3. 使用场景:Text类型适用于搜索和分析非结构化文本;Keyword类型适用于存储需要精确检索的结构化数据。
  4. 性能考虑:Text类型由于需要经过分析器处理,可能会占用更多的资源;Keyword类型查询性能更高,但不支持全文搜索。

整数(Integer)

  1. 作用:适用于存储32位有符号整数,如年龄、评分等。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      }
    }
  }
}

长整数(Long)

  1. 作用:适用于存储64位有符号整数,如大型计数器、用户ID等。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "user_id": {
        "type": "long"
      }
    }
  }
}

浮点数(Float)

  1. 作用:适用于存储32位单精度浮点数,如价格、温度等。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "price": {
        "type": "float"
      }
    }
  }
}

双精度浮点数(Double)

  1. 作用:适用于存储64位双精度浮点数,如科学计算结果。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "result": {
        "type": "double"
      }
    }
  }
}

日期(Date)

  1. 作用:适用于存储日期和时间,如日志时间戳、事件日期等。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "created_at": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

布尔(Boolean)

  1. 作用:适用于存储布尔值true、false,如开关状态、是否可用等。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "is_active": {
        "type": "boolean"
      }
    }
  }
}

二进制(Binary)

  1. 作用:用于存储Base64编码的二进制数据,如文件、图片等。
  2. 注意事项:二进制字段不适用于搜索,主要用于存储原始数据。
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "file": {
        "type": "binary"
      }
    }
  }
}

范围类型(Range Types)

  1. 作用:用于存储数值范围,如年龄范围、价格区间等。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "age_range": {
        "type": "integer_range"
      }
    }
  }
}

对象(Object)

  1. 作用:用于存储结构化或半结构化数据,如用户信息、配置项等。
  2. 注意事项:对象类型字段在Elasticsearch 6.x及以后版本中已被弃用,建议使用嵌套对象(Nested Object)或多字段(Multi-Field)。
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "user": {
        "type": "object",
        "enabled": false
      }
    }
  }
}

嵌套对象(Nested Object)

  1. 作用:用于存储嵌套结构的数据,例如包含数组对象的场景(订单中的多个商品项)。
  2. 注意事项:嵌套对象查询性能较低,应谨慎使用。
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "orders": {
        "type": "nested",
        "properties": {
          "product_name": { "type": "text" },
          "price": { "type": "double" }
        }
      }
    }
  }
}
  1. nested 类型的特点:
  • 独立性:数组中的每个对象都是独立的,查询条件不会跨对象匹配。
  • 查询方式:必须使用 nested 查询来访问嵌套对象的字段。
  • 更新限制:更新嵌套对象时,必须重新索引整个文档。
  • 性能考量:嵌套文档会增加索引大小和查询复杂度,应合理使用。
  1. 适用场景
  • 处理对象数组,且需要在同一个对象内进行多条件匹配。
  • 如电商产品的评论列表(每条评论有作者、内容、评分等字段)。
  • 如文章的标签列表(每个标签有名称、权重等属性)。
  1. nested和object的区别:当有一个字段包含对象数组时,默认的 object 类型会将这些对象 “扁平化” 处理,可能导致查询结果不符合预期,而 nested 类型则会保留数组中每个对象的独立性。

假设有这样的文档结构:

{
  "group": "fans",
  "user": [
    {"first": "John", "last": "Smith"},
    {"first": "Alice", "last": "White"}
  ]
}

如果 user 字段使用默认的 object 类型,Elasticsearch 会将其内部结构扁平化处理为:

user.first: ["John", "Alice"]
user.last: ["Smith", "White"]

这种情况下,如果你查询 user.first: John AND user.last: White,会错误地匹配到这个文档(因为扁平化后两个条件会跨对象匹配)。

而使用 nested 类型,每个对象会被视为独立的文档,确保查询条件只会在同一个对象内匹配。

定义 nested 类型映射

PUT my_index
{
  "mappings": {
    "properties": {
      "group": { "type": "keyword" },
      "user": {
        "type": "nested",  // 定义为nested类型
        "properties": {
          "first": { "type": "text" },
          "last": { "type": "text" }
        }
      }
    }
  }
}

定义 nested 类型字段

GET my_index/_search
{
  "query": {
    "nested": {
      "path": "user",  // 指定nested字段的路径
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "John" } },
            { "match": { "user.last": "Smith" } }
          ]
        }
      },
      "inner_hits": {  // 可选,返回匹配的嵌套对象
        "highlight": {
          "fields": {
            "user.first": {}
          }
        }
      }
    }
  }
}

多字段(Multi-Field)

  1. 作用:允许一个字段使用不同的类型进行索引,适用于需要同时进行全文搜索和精确匹配的场景。
  2. 注意事项:多字段可以提高查询的灵活性,但会占用更多的存储空间。
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "full_name": {
        "type": "text",
        "fields": {
          "raw": { "type": "keyword" }
        }
      }
    }
  }
}

IP地址(IP)

  1. 作用:用于存储IP地址,如访问日志中的客户端IP。
  2. 注意事项:IP地址类型支持IP地址的查询和聚合。
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "ip_address": {
        "type": "ip"
      }
    }
  }
}

完成(Completion)

  1. 作用:用于自动完成建议,如搜索引擎的自动补全功能。
  2. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "suggest": {
        "type": "completion"
      }
    }
  }
}

地理位置点(Geo-point)

  1. 作用:用于存储地理位置点,如用户的地理位置信息。
  2. 注意事项:地理位置点类型支持基于地理位置的查询和聚合。
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

地理位置形状(Geo-shape)

  1. 作用:用于存储地理空间形状,如国家边界、城市区域等。
  2. 注意事项:地理形状类型支持复杂的地理空间查询。
  3. 示例代码:
PUT /my_index
{
  "mappings": {
    "properties": {
      "shape": {
        "type": "geo_shape"
      }
    }
  }
}
posted @ 2025-09-20 12:10  相遇就是有缘  阅读(21)  评论(0)    收藏  举报