Elasticsearch 提供了一系列丰富的字段类型来支持不同类型的数据存储和查询。理解并正确选择字段类型是设计高效、准确的索引映射的关键。以下是一些常见的字段类型及其应用场景:
一、文本类型
1. text
适用于全文搜索的文本数据。text
类型的字段会被分词(tokenized)并建立倒排索引,支持模糊搜索、短语搜索、同义词搜索等复杂查询。默认使用标准分析器,但可以指定其他分析器以适应特定语言或文本处理需求。
{
"properties": {
"description": {
"type": "text",
"analyzer": "english"
}
}
}
2. keyword
用于存储不可分词的、完整的、原始的值,如标签、ID、电子邮件地址等。keyword
类型字段用于精确匹配、排序、聚合等操作,不进行分词处理。
{
"properties": {
"product_id": {
"type": "keyword"
}
}
}
二、数值类型
1. long
/ integer
/ short
/ byte
整数类型,分别对应不同大小的整数值范围。
{
"properties": {
"quantity_sold": {
"type": "integer"
}
}
}
2. double
/ float
浮点数类型,分别对应不同精度的浮点数值。
{
"properties": {
"average_rating": {
"type": "double"
}
}
}
三、日期类型
1. date
存储日期和时间数据,支持多种格式和时间区间查询。
{
"properties": {
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
四、地理类型
1. geo_point
存储经纬度坐标,支持地理距离查询、边界框查询、多边形查询等。
{
"properties": {
"location": {
"type": "geo_point"
}
}
}
五、特殊类型
1. boolean
存储布尔值(true/false)。
{
"properties": {
"is_active": {
"type": "boolean"
}
}
}
2. object
用于嵌套结构,内部可以包含其他字段类型。
{
"properties": {
"address": {
"type": "object",
"properties": {
"street": { "type": "text" },
"city": { "type": "text" },
"zip_code": { "type": "keyword" }
}
}
}
}
3. nested
用于存储数组形式的独立对象,每个对象都有自己的文档结构,可以独立查询和聚合。
{
"properties": {
"tags": {
"type": "nested",
"properties": {
"name": { "type": "text" },
"color": { "type": "keyword" }
}
}
}
}
六、多字段(Multi-Fields)
为一个字段创建多个映射定义,以便以不同方式索引和查询同一字段的内容。
{
"properties": {
"title": {
"type": "text",
"fields": {
"raw": { "type": "keyword" },
"english": {
"type": "text",
"analyzer": "english"
}
}
}
}
}
在这个例子中,title
字段既有一个默认的 text
类型映射,还有一个 keyword
类型的子字段 title.raw
用于精确匹配,还有一个使用英语分析器的 title.english
子字段。
实战应用
在实际使用中,根据业务数据的性质选择合适的字段类型,并结合多字段、分析器等特性进行定制化设置,可以显著提升Elasticsearch的搜索性能和查询准确性。例如:
- 对于用户搜索输入,使用
text
类型字段并配置相应的语言分析器。 - 对于需要排序、过滤或聚合的字段,如产品类别、用户角色等,使用
keyword
类型。 - 对于包含时间序列数据的字段,如交易时间、登录时间等,使用
date
类型。 - 对于需要进行地理位置查询的字段,如用户位置、门店坐标等,使用
geo_point
类型。
通过合理设置字段类型,您可以在Elasticsearch中高效地存储、查询和分析各种类型的数据。在设计映射时,务必参考官方文档以获取最新的字段类型特性和最佳实践。