Elasticsearch教程之《一文读懂ES的数据类型Field datatypes》

1,488 阅读6分钟

Elasticsearch教程之《一文读懂ES的数据类型Field datatypes》

摘要

Elasticsearch是一个基于Lucene的搜索引擎,它提供了丰富的数据类型来满足不同场景下的数据存储和查询需求。本文将详细介绍Elasticsearch中的数据类型,包括它们的应用场景、代码示例以及使用注意事项,并特别对比文本(Text)和关键词(Keyword)两种类型。

1. 核心数据类型

1.1 文本(Text)

  • 应用场景:适用于需要全文搜索的字段,如文章内容、商品描述等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "description": {
            "type": "text",
            "analyzer": "standard"
          }
        }
      }
    }
    
  • 使用注意事项
    • 选择适当的分析器以适应文本内容的语言和格式。
    • 避免使用Text类型存储需要精确匹配的字段,如邮箱地址。

1.2 关键词(Keyword)

  • 应用场景:适用于需要精确匹配的字段,如用户ID、邮箱地址、状态码等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "email": {
            "type": "keyword"
          }
        }
      }
    }
    
  • 使用注意事项
    • 由于Keyword类型的字段不会被分析器处理,它们适合用于排序、过滤和聚合。
    • 考虑使用Keyword类型存储可能需要多种查询方式的字段。

1.3 整数(Integer)

  • 应用场景:适用于存储32位有符号整数,如年龄、评分等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "age": {
            "type": "integer"
          }
        }
      }
    }
    
  • 使用注意事项
    • 考虑数值范围和精度需求,选择合适的整数类型(Integer或Long)。

1.4 长整数(Long)

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

1.5 浮点数(Float)

  • 应用场景:适用于存储32位单精度浮点数,如价格、温度等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "price": {
            "type": "float"
          }
        }
      }
    }
    
  • 使用注意事项
    • 注意浮点数的精度问题,根据需求选择Float或Double。

1.6 双精度浮点数(Double)

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

1.7 日期(Date)

  • 应用场景:适用于存储日期和时间,如日志时间戳、事件日期等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "created_at": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
          }
        }
      }
    }
    
  • 使用注意事项
    • 选择合适的日期格式,以确保日期的正确解析和索引。

1.8 布尔(Boolean)

  • 应用场景:适用于存储布尔值,如开关状态、是否可用等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "is_active": {
            "type": "boolean"
          }
        }
      }
    }
    
  • 使用注意事项
    • 确保布尔值以正确的格式存储,避免使用字符串形式的"true"或"false"。

2. 特殊数据类型

2.1 二进制(Binary)

  • 应用场景:用于存储二进制数据,如文件、图片等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "file": {
            "type": "binary"
          }
        }
      }
    }
    
  • 使用注意事项
    • 二进制字段不适用于搜索,主要用于存储原始数据。

2.2 范围类型(Range Types)

  • 应用场景:用于存储数值范围,如年龄范围、价格区间等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "age_range": {
            "type": "integer_range"
          }
        }
      }
    }
    
  • 使用注意事项
    • 范围类型字段不适用于常规的精确匹配查询。

2.3 对象(Object)

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

2.4 嵌套对象(Nested Object)

  • 应用场景:用于存储嵌套结构的数据,如订单中的多个商品项。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "orders": {
            "type": "nested",
            "properties": {
              "product_name": { "type": "text" },
              "price": { "type": "double" }
            }
          }
        }
      }
    }
    
  • 使用注意事项
    • 嵌套对象查询性能较低,应谨慎使用。

2.5 多字段(Multi-Field)

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

2.6 IP地址(IP)

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

2.7 完成(Completion)

  • 应用场景:用于自动完成建议,如搜索引擎的自动补全功能。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "suggest": {
            "type": "completion"
          }
        }
      }
    }
    
  • 使用注意事项
    • 完成字段类型主要用于前端的自动完成功能。

2.8 地理位置点(Geo-point)

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

2.9 地理位置形状(Geo-shape)

  • 应用场景:用于存储地理空间形状,如国家边界、城市区域等。
  • 代码示例
    PUT /my_index
    {
      "mappings": {
        "properties": {
          "shape": {
            "type": "geo_shape"
          }
        }
      }
    }
    
  • 使用注意事项
    • 地理形状类型支持复杂的地理空间查询。

3. 文本(Text)与关键词(Keyword)的对比

  • 存储方式:Text类型字段会被分析器处理,分解成词元并存储在倒排索引中;Keyword类型字段则保持原样存储。
  • 搜索方式:Text类型支持全文搜索,包括模糊查询和前缀查询;Keyword类型支持精确匹配和聚合。
  • 使用场景:Text类型适用于搜索和分析非结构化文本;Keyword类型适用于存储需要精确检索的结构化数据。
  • 性能考虑:Text类型由于需要经过分析器处理,可能会占用更多的资源;Keyword类型查询性能更高,但不支持全文搜索。

4. 结论

选择合适的数据类型对于Elasticsearch的性能和查询效率至关重要。本文提供了Elasticsearch各种数据类型的详细介绍、应用场景、代码示例以及使用注意事项,希望能够帮助您在实际项目中做出更合理的选择。同时,理解Text和Keyword类型的区别,将有助于您根据具体需求设计更有效的索引策略。


请注意,以上代码示例仅供参考,实际应用中可能需要根据具体需求进行调整。如需了解更多高级特性和最佳实践,请参考Elasticsearch的官方文档。