字段类型必须映射到 Elasticsearch 的基本类型之一,并且需要添加有关如何索引字段的选项。
字段类型 | Elasticsearch 类型 | 说明 |
---|---|---|
string,varchar | keyword | 这是不可标记的文本字段,例如 CODE001 |
string,varchar,text | text | 这是要标记化的文本字段,例如 a nice text |
integer | integer | 这是一个整型(32位),例如 1、2、3 |
long | long | 这是一个长整型(64位) |
float | float | 这是一个浮点数(32位),例如 1.2 或 4.5 |
double | double | 这是一个 double 类型浮点数(64位) |
boolean | boolean | 这是一个布尔值:true 或 false |
date / datetime | date |
这是一个日期时间值 |
bytes / binary | binary | 这包含一些用于二进制数据的字节,例如文本或字节流 |
其他Elasticsearch映射类型:
keyword 类型:存储数据时候,不会分词建立索引,支持模糊、支持精确匹配;支持聚合、排序操作。
keyword 类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置 ignore_above 指定自持字符长度,超过给定长度后的数据将不被索引,无法通过 term 精确匹配检索返回结果。
使用场景: 存储邮箱号码、url、name、title,手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。 用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计))。 直接将完整的文本保存到倒排索引中。
text 类型:存储数据时候,会自动分词,并生成索引,支持全文检索、支持模糊、精确查询;不支持聚合和排序操作。
text 类型的最大支持的字符长度无限制,适合大字段存储。
使用场景: 存储全文搜索数据,例如:邮箱内容、地址、代码块、博客文章内容等。
默认结合 standard analyzer(标准解析器)对文本进行分词、倒排索引。 默认结合标准分析器进行词命中、词频相关度打分。
所以创建索引时,当字段需要进行排序、分组、聚合等操作时,需要使用 keyword 类型。
【实例】在 Elasticsearch 中创建订单索引。
首先定义一个订单信息(order_info)的数据表结构:
名称 | 类型 | 说明 |
---|---|---|
order_id | long | 订单ID |
order_no | text | 订单编号 |
product_name | keyword | 商品名称 |
product_quantity | integer | 商品数量 |
price | double | 商品价格 |
sent | boolean | 订单发送状态 |
order_date | date(time) | 订单日期 |
order_remark | text | 订单备注 |
(1)使用 Elasticsearch 指令创建索引
PUT /order_info
{
"settings": {
"index": {
"number_of_shards": "2",
"number_of_replicas": "1"
}
},
"mappings": {
"properties": {
"order_id": {"type": "long"},
"order_no": {"type": "text"},
"product_name": {"type": "keyword"},
"product_quantity": {"type": "integer"},
"price": {"type": "double"},
"sent": {"type": "boolean"},
"order_date": {"type": "date"},
"order_remark": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
参数说明:
number_of_shards:该参数控制组成索引的分片(Shard)的数量。
number_of_replicas:该参数可控制复制副本(Replica)的数量,也就是说,为了实现高可用性,在集群中复制数据的次数。比较好的做法是设置该值至少为1。
执行结果:
(2)使用 Java API 创建索引
/**
* 创建索引
* @param indexName 索引名称
* @author pan_junbiao
*/
@Override
public boolean createIndex(String indexName)
{
boolean result = false;
try
{
//1.创建索引的请求
CreateIndexRequest request = new CreateIndexRequest(indexName);
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
//创建订单ID文档字段
builder.startObject("order_id");
{
builder.field("type", "long");
}
builder.endObject();
//创建订单编号文档字段
builder.startObject("order_no");
{
builder.field("type", "text");
}
builder.endObject();
//创建商品名称文档字段
builder.startObject("product_name");
{
builder.field("type", "keyword");
}
builder.endObject();
//创建商品数量文档字段
builder.startObject("product_quantity");
{
builder.field("type", "integer");
}
builder.endObject();
//创建商品价格文档字段
builder.startObject("price");
{
builder.field("type", "double");
}
builder.endObject();
//创建订单发送状态文档字段
builder.startObject("sent");
{
builder.field("type", "boolean");
}
builder.endObject();
//创建订单日期文档字段
builder.startObject("order_date");
{
builder.field("type", "date");
}
builder.endObject();
//创建订单备注文档字段
builder.startObject("order_remark");
{
builder.field("type", "text")
//插入时分词
.field("analyzer", "ik_smart")
//搜索时分词
.field("search_analyzer", "ik_max_word");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
request.mapping(builder);
//2客户端执行请求,请求后获得响应
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
result = true;
}
catch (Exception ex)
{
ex.printStackTrace();
}
return result;
}
编写测试方法:
@Autowired
private MeetElasticsearchService meetElasticsearchService;
/**
* 测试:创建索引
* @author pan_junbiao
*/
@Test
public void createIndex()
{
//索引名称
String indexName = "order_info";
//执行创建索引
boolean result = meetElasticsearchService.createIndex(indexName);
//打印结果
if(result)
{
System.out.println("索引创建成功");
}
else
{
System.out.println("索引创建失败");
}
}
使用 ElasticSearch-head 插件查看执行结果: