当前位置: 首页 > news >正文

【Elasticsearch入门到落地】9、hotel数据结构分析

接上篇《8、RestClient操作索引库-基础介绍及导入demo》
上一篇我们介绍了RestClient的基础,并导入了使用Java语言编写的RestClient程序Demo以及将要分析的数据库。本篇我们就要分析导入的宾馆数据库tb_hotel表结构的具体含义,并分析如何建立其索引库。

一、分析前需要考虑的问题

我们如果想要建立索引库,必须要考虑以下问题:

问题一:索引库中的字段名、数据类型;
问题二:哪些字段参与搜索、哪些字段进行分词?
问题三:如果分词,分词器是什么?

带着这些疑问,我们来分析tb_hotel表结构:

大致看一下上面这个表结构,可以初步回答三个问题:
先说问题一,上面这个表里面的字段名和字段类型,其实就是我们将要建立索引库的字段名和类型,当然不一定是所有的字段,这个可以根据需要,参与搜索的建议全部加入。
再说问题二,哪些字段参与搜索?哪些字段进行分词?这俩问题其实跟业务场景息息相关,现在的场景确定是一个酒店业务,那么“酒店名称”这个字段一定是要参与搜索的,且因为酒店名称比较长,且可能带有一些关键词,所以这里肯定也需要进行分词。
然后是问题三,用什么分词器?这里我们先卖个关子最后再说。

二、分析数据库字段

我们下面逐个分析每个字段,如何对应创建我们的索引库。

1、酒店id(id)

这个是酒店数据的唯一标识主键,也可以作为我们索引库的唯一标识,所以这个字段是需要加入mapping索引库的,mysql中该字段为PROMARY KEY,是一个表的主键,不用分词,所以我们在索引库中就可以定义为keyword精确值类型。

"id":{"type":"keyword"}

因为是一个唯一标识,且是纯数字,这里我们不对它进行分词。

2、酒店名称(name)

这个上面咱们已经说过,是一个重点字段,它在mysql中是varchar类型,在mapping索引库中可以这是为text类型(因为需要分词),因为该字段是需要参与搜索的,所以要添加“analyzer”分词器属性,指定分词器为“ik_max_word”:

"name":{"type":"text","analyzer":"ik_max_word"}

这里分词器为啥要选“ik_max_word”呢?这里我们解释一下,以下是常见的分词器表:

因为我们需要检索和分析的是中文名称或文档内容,最适合的分词器应该是“Chinese Analyzer”。而ik_max_word属于Chinese Analyzer(中文分词器)的一种分词模式。IK分词器是Elasticsearch中常用的中文分词插件,它提供了两种分词模式:ik_max_word和ik_smart。其中:

(1)ik_max_word:

●功能:将文本进行最细粒度的拆分,即将文本最大程度地切分成独立的词汇。
●特点:通过条件随机场(CRF)模型识别词汇边界,并使用动态规划寻找最优的词段划分,从而穷尽各种可能的词汇组合。
●应用场景:适用于需要更全面的分词结果,以便在索引时捕捉到更多的词汇信息,提高搜索的召回率。例如,在搜索引擎或信息检索系统中,可以使用ik_max_word模式来最大化地将文章内容分词,以便在搜索时能够匹配到更多的相关结果。

(2)ik_smart:

●功能:对文本进行智能分词,结合理解歧义和未知词的算法,对文本进行词典分词的同时,智能识别词汇的边界。
●特点:更注重分词的准确性和歧义处理,词典中的词汇边界会被优先考虑,从而可能减少不必要的扩展。
●应用场景:适用于需要更精确的分词结果,以便在搜索时能够更准确地匹配到用户查询的意图。例如,在搜索引擎中,可以使用ik_smart模式来更精确地搜索到用户想要的结果。
概括起来,ik_max_word是IK分词器中用于中文文本细粒度分词的一种模式,适用于需要提高搜索召回率的场景。
所以我们选择了“ik_max_word”分词器。

3、酒店地址(address)等其他字段

这里我们不再一一赘述,将其他字段逐个分析后,我列出了相关表格:

这里我们只介绍一个字段,就是location,回头我们查询酒店具体的坐标的时候,需要将经纬度合并计算出精确位置,此时我们使用的索引库类型就是geo_point类型。这个geo_point类型是Elasticsearch中用于表示地理位置坐标的特殊数据类型,它通过支持空间查询、地理位置分析、空间索引等功能,为基于地理位置的应用和服务提供了强大的支持。将经纬度组合成一个字段时,在索引库中使用geo_point类型可以充分利用这些功能,提高应用的性能和用户体验。

三、创建索引库语句

按照上面的分析,最终的mapping索引库的DSL建表语句如下:

# 酒店的mapping索引库
PUT /hotel
{
  "mappings": {
    "properties": {
      "id": { "type": "keyword" },
      "name": { "type": "text", "analyzer": "ik_max_word" },
      "address": { "type": "text", "analyzer": "ik_max_word" },
      "price": { "type": "integer" },
      "score": { "type": "integer" },
      "brand": { "type": "keyword" },
      "city": { "type": "keyword" },
      "star_name": { "type": "keyword" },
      "business": { "type": "text", "analyzer": "ik_max_word"},  
      "location": { "type": "geo_point" },
      "pic": { "type": "keyword", "index": false  } 
    }
  }
}

我们打开Kibana界面,输入上述语句创建索引库并执行:

查询索引库,发现已经新增成功:

至此,我们对tb_hotel表结构的具体含义,以及做索引需要考虑的具体问题就讲解完毕了,并编写了DSL语句,并执行完毕。下一篇我们来进行java代码的编写,初始化RestClient并执行一些命令来操作索引库。

参考:《黑马Elasticsearch全套教程》

转载请注明出处:https://blog.csdn.net/acmman/article/details/146140551

相关文章:

  • SAP监控体系和机制
  • 【Go每日一练】统计字符出现的次数
  • 【python爬虫】酷狗音乐爬取练习
  • Manus详细介绍
  • 复现 MODEST 机器人抓取透明物体 单目 ICRA 2025
  • 【编译器】VSCODE编译C语言
  • 如是APP:AI精准匹配需求,信用体系重构信任,双轮驱动打造无套路电商
  • 将本地已有的项目上传至仓库
  • 第七章:go 切片
  • 对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)
  • 数据结构(回顾)
  • 深度学习算法实战——风格迁移(主页有源码)
  • 开发指南107-谷歌内核浏览器滚动条设置
  • 开发过程中遇到的问题记录
  • 011---UART协议的基本知识(一)
  • Tensorflow 2.0 GPU的使用与限制使用率及虚拟多GPU
  • 计算机视觉算法实战——野猪检测(主页有源码)
  • 【2025年27期免费获取股票数据API接口】实例演示五种主流语言获取股票行情api接口之沪深A股跌停股池数据获取实例演示及接口API说明文档
  • 虚函数和虚表的原理是什么?
  • Deepseek中的MoE架构的改造:动态可变参数激活的MoE混合专家架构(DVPA-MoE)的考虑
  • 就规范涉企行政执法专项行动有关问题,司法部发布解答
  • 沃尔玛上财季净利下滑12%:关税带来成本压力,新财季价格涨幅将高于去年
  • 阿里上财年营收增6%,蒋凡:会积极投资,把更多淘宝用户转变成即时零售用户
  • “家国万里时光故事会” 举行,多家庭共话家风与家国情怀
  • 龚正会见哥伦比亚总统佩特罗
  • 刘强东坐镇京东一线:管理层培训1800人次,最注重用户体验