• 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等字段的值。实现了在一个字段里搜到多个字段的内容。而且这种拷贝做了优化,并不是真的把文档拷贝进去,而只是基于它创建倒排索引,所以将来你查的时候看不到这个字段,好像不存在一样,但是搜却能根据它搜。

  • 相关阅读:
    三道 华为 面试题
    百度面试题01——50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
    一首笔试题 C实现
    图像缩放算法及速度优化——(一)最近邻插值
    一个简单的二叉树排序算法
    OS的四大特征
    OS的目的和功能
    桶排序
    快速排序
    OS的运行机制
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/16535937.html
Copyright © 2020-2023  润新知