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

【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


http://www.kler.cn/a/578966.html

相关文章:

  • LeetCode 2523. Closest Prime Numbers in Range(2025/3/7每日一题)
  • 中小企业Windows双因素认证的“轻量化”安全解决方案
  • 探索数据仓库自动化:ETL流程设计与实践
  • qt 播放pcm音频
  • 【模板】树算法之LCA(最近公共祖先)
  • Shell编程概述与Shell变量
  • 物联网中设备异构的问题-甚至可以用工业数据采集器?
  • C++之序列容器(vector,list,dueqe)
  • 在运维工作中,Lvs、nginx、haproxy工作原理分别是什么?
  • 【TI】如何更改 CCS20.1.0 的 WORKSPACE 默认路径
  • 开发环境搭建-05.后端环境搭建-前后端联调-通过断点调试熟悉项目代码特点
  • Hot 3D 人体姿态估计 HPE Demo复现过程
  • Excel 粘贴数据到可见单元格
  • 信号的希尔伯特变换与等效基带表示:原理与Matlab实践
  • [数据分享第七弹]全球洪水相关数据集
  • 使用OpenCV和MediaPipe库——实现人体姿态检测
  • 论文阅读方法
  • 2008-2024年中国手机基站数据/中国移动通信基站数据
  • GHCTF2025--Web
  • Windows软件插件-音视频文件读取器