Elasticsearch映射类型

字段类型必须映射到 Elasticsearch 的基本类型之一,并且需要添加有关如何索引字段的选项。

1、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映射类型: 

Elasticsearch映射类型_第1张图片

2、keyword 与 text 的区别

keyword 类型

keyword 类型:存储数据时候,不会分词建立索引,支持模糊、支持精确匹配;支持聚合、排序操作。

keyword 类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置 ignore_above 指定自持字符长度,超过给定长度后的数据将不被索引,无法通过 term 精确匹配检索返回结果。

使用场景: 存储邮箱号码、url、name、title,手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。 用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计))。 直接将完整的文本保存到倒排索引中。

text 类型

text 类型:存储数据时候,会自动分词,并生成索引,支持全文检索、支持模糊、精确查询;不支持聚合和排序操作。

text 类型的最大支持的字符长度无限制,适合大字段存储。

使用场景: 存储全文搜索数据,例如:邮箱内容、地址、代码块、博客文章内容等。

默认结合 standard analyzer(标准解析器)对文本进行分词、倒排索引。 默认结合标准分析器进行词命中、词频相关度打分。

所以创建索引时,当字段需要进行排序、分组、聚合等操作时,需要使用 keyword 类型。

3、综合实例

【实例】在 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。

执行结果:

Elasticsearch映射类型_第2张图片

(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 插件查看执行结果:

Elasticsearch映射类型_第3张图片

你可能感兴趣的:(Elasticsearch,我の原创,elasticsearch)