5-实战hotel表创建es映射

 对酒店业务创建es映射

创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:

  • 字段名

  • 字段数据类型

  • 是否参与搜索

  • 是否需要分词

  • 如果分词,分词器是什么?

其中:

  • 字段名、字段数据类型,可以参考数据表结构的名称和类型

  • 是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索

  • 是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词

数据库表结构如下

CREATE TABLE `tb_hotel` (
  `id` bigint(20) NOT NULL COMMENT '酒店id',
  `name` varchar(255) NOT NULL COMMENT '酒店名称',
  `address` varchar(255) NOT NULL COMMENT '酒店地址',
  `price` int(10) NOT NULL COMMENT '酒店价格',
  `score` int(2) NOT NULL COMMENT '酒店评分',
  `brand` varchar(32) NOT NULL COMMENT '酒店品牌',
  `city` varchar(32) NOT NULL COMMENT '所在城市',
  `star_name` varchar(16) DEFAULT NULL COMMENT '酒店星级,1星到5星,1钻到5钻',
  `business` varchar(255) DEFAULT NULL COMMENT '商圈',
  `latitude` varchar(32) NOT NULL COMMENT '纬度',
  `longitude` varchar(32) NOT NULL COMMENT '经度',
  `pic` varchar(255) DEFAULT NULL COMMENT '酒店图片',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT
View Code

酒店数据的索引库结构:

#酒店 mapping
POST /hotle
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "address":{
        "type": "keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "score":{
        "type": "integer"
      },
      "brand":{
        "type": "keyword",
        "copy_to": "all"
      },
      "city":{
        "type": "keyword",
        "copy_to": "all"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}
View Code

特殊字段说明

(1) id不能定义成long类型,在es中是一个字符串,因为它是一个整体不可分割,所以不参与分词,用keyword。

(2) location:地理坐标,里面包含精度、纬度

(3) all:一个组合字段,其目的是将多字段的值 利用copy_to合并,提供给用户搜索。

copy_to说明:我们的酒店名称name和酒店品牌brand和商圈bussiness字段,将来都要参与搜索,也就是查询条件不是一个值,而是多个值,根据一个字段搜索的效率肯定比多个字段搜索的效率高,es提供了一个copy_to的功能来解决这种问题(我们需要根据多个字段搜,又想效率比较高),例子中一个字段all同时拥有了name、brand、bussiness等字段的值。实现了在一个字段里搜到多个字段的内容。而且这种拷贝做了优化,并不是真的把文档拷贝进去,而只是基于它创建倒排索引,所以将来你查的时候看不到这个字段,好像不存在一样,但是搜却能根据它搜。

posted @ 2022-07-30 21:59  JustJavaIt  阅读(176)  评论(0)    收藏  举报