Elasticsearch聚合、自动补全 | 黑马旅游

news2024/12/23 16:32:40

一、数据聚合

1、聚合的分类

聚合(aggregations)可以实现对文档数据的统计、分析、运算。

聚合常见有三类:

  • 桶聚合 Bucket:对文档数据分组,并统计每组数量
    • TermAggregation:按照文档字段值分组(有点像mysql的group by)
    • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月一组
  • 度量聚合 Metric:对文档数据做计算,例如最大值,最小值,平均值等
    • avg:求平均值
    • max:求最大值
    • min:求最小值
    • stats:同时求max、min、avg、sum等
  • 管道聚合 Pipeline:基于其他聚合结果再做聚合

参与聚合的字段类型必须是不可分词的:

  • keyword
  • 数值
  • 日期
  • 布尔

2、DSL实现Bucket聚合

现在要统计所有数据中的酒店品牌有几种,可以根据酒店品牌的名称做聚合

aggs代表聚合,与query同级,用aggs的时候query的作用是做返回,在query范围下聚合

聚合必须要的三要素是:聚合名称,聚合类型,聚合字段

可以配置的属性:

  • size:限制聚合结果的数量
  • order:指定聚合结果排序方式
  • field:指定聚合字段

3、DSL实现Metrics聚合

用了mertrics的stats,最大、最小、平均都求,然后再上面order指定根据平均值排序

4、RestAPI实现聚合

5、案例

实现对品牌、城市、星级的聚合

需求:搜索页面的品牌、城市等信息不应该是在页面写死,而是通过聚合索引库中的酒店数据得来

要用map来接收,map的key就是城市或者星级这些,value就是对应的聚合list

这样就可以完成基本的功能了,但会有个问题:

像这样,如果用户带着条件来查询的话,比如带着虹桥来查询,我们给用户筛选条件聚合还是根据全局索引聚合的,会先很多别的城市,这些城市没有虹桥如果点击就出问题了。所以我们要想办法改成对用户的输入条件聚合

其实就是在聚合条件上加查询条件,限制聚合的范围。

 二、自动补全

1、拼音分词器

要实现根据字母做补全,就必须对文档按照拼音分词。

直接去下载拼音分词器的插件,然后analyzer选pinyin就行

2、自定义分词器

拼音分词器的问题:分的次都是单个的没有什么用,ru、jia这种没用的,还有就是全部第一个小写,而且我们大多数情况还是用汉字进行分词,而不是拼音,我们要保留汉字分词

这个时候就必须要自定义分词器

要自定义分词器,必须先了解分词器的组成

  • character filters:在tokenizer之前对文本进行处理,例如删除字符、替换字符
  • tokenizer:将文本按照一定的规则切割成词条(tern),例如keyword就是不分词
  • tokenizer filter:将tokenizer输出的词条做进一步处理,例如大小写转化,同义词处理,拼音处理

所以,我们知道pinyin分词器不会进行分词,那么我们就可以先用ik分词器先分词,再用pinyin分词器做处理,就可以得到pinyin的分词了

但是拼音分词器会对每个字的首字母结合的还有会去中文,这两个我们要优化

 我们在创建索引的时候,可以用自定义分词器,但是在搜索的时候,就不能使用这个分词器了

 

3、completion suggester查询

es提供了completion suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对文档中字段的类型有一些约束:

参与补全查询的字段必须是completion类型(专门做自动补全查询的类型)

字段的内容一般是用来补全的多个词条形成的数组(右图,如果我们输入的s,那么可以补全这两个数据,但如果我们输入w,没有等多个词条的话就不会补全,所以分多个词条更人性化)

前面是品牌,后面是产品的名称,一个产品的都存在一个数组里

4、案例实战

实现hotel索引库的自动补全、拼音搜索功能

思路:

  1. 修改hotel索引库结构,设置自定义拼音分词器
  2. 修改索引库的name、all字段,使用自定义分词器
  3. 索引库添加一个新字段suggestion,类型为completion类型,使用自定义的分词器
  4. 给HotelDoc类添加suggestion字段,内容包含brand、business
  5. 重新导入数据到hotel库

首先,我们先修改索引库的数据结构,要多加一个completion_analyzer分词器,这个分词器是keyword,代表不分词,因为我们参与自动补全的都是一个个的词条,这些词条已经是最小了不需要再分词了,然后再用拼音分词器变成拼音就好了

all的创建索引库用的是自定义的拼音结合的分词器,搜索的分词器就用ik

因为这个suggestion是多个类型的词条组成的数组,所以用list,然后品牌和商圈都可以做自动补全的内容。把想要做自动动补全的都可以加进去。但是这个商圈,business可能有多个是用/分割开的,所以我们要进一步进行拆分

然后加入,现在就可以搜索一下试试了

然后我们就要用java的客户端来操作了 

这样就能实现自动补全功能了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国电子学会2023年03月青少年软件编程Scratch图形化等级考试试卷二级真题(含答案)

中国电子学会2023年03月青少年软件编程Scratch图形化等级考试试卷二级 1.小猫的程序如图所示,积木块的颜色与球的颜色一致。点击绿旗执行程序后,下列说法正确的是?(C)(2分) A.小猫一直在左右移…

JDBC详解(二):获取数据库连接(超详解)

JDBC详解(二):获取数据库连接 前言一、要素一:Driver接口实现类1、Driver接口介绍2、加载与注册JDBC驱动 二、要素二:URL三、要素三:用户名和密码四、数据库连接方式举例4.1 连接方式一4.2 连接方式二4.3 连…

15天学习MySQL计划-数据库引擎(进阶篇)第六天

15天学习MySQL计划-数据库引擎(进阶篇)第六天 1.数据库引擎 1.MySQL体系结构 连接层服务层引擎层存储层 2.存储引擎 存储引擎简介 ​ 1.概述 ​ 存储引擎就是存储数据,建立索引,更新/查询数据等技术的实现方式。存储引擎是基…

android ANativeWindow surface显示

前言 最近做车机camera 倒车影像问题,需要通过c调用camera,并显示在android ui界面之上。 最终效果图 代码实现 Android.bp cc_binary {name: "stest",vendor: true,srcs: ["main.cpp"],shared_libs: ["libcutils",&q…

Android入门基础教程

第1章 Android Studio运行第一个程序 1.1 Android Studio下载: 1.1.1 Android开发者官网: https://developer.android.google.cn ​ 1.1.2 下载Android Studio开发者工具: 进入Android开发者官网;找到Android Studio工具下载页…

【LeetCode刷题笔记】反转链表、移除链表元素、两两交换链表中的节点、删除链表的倒数第N个结点

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录 反转链表移除链表元素两两交换链表中的节点删除链表的倒数第 N 个结点&…

脉搏波信号去噪方法

一、引言 脉搏波信号是血管中血液流动产生的振动信号,反映了血管的弹性特性和血流动力学信息。由于其丰富的生理信息,脉搏波信号在诊断和监测心血管疾病、神经系统疾病等方面具有重要意义。然而,原始脉搏波信号往往受到生理干扰、环境噪声等…

人工智能在心电信号的心律失常应用

心律失常是一种常见的心脏疾病,它会导致心脏跳动不规律,严重的甚至会引发心脏骤停。传统的心律失常诊断方法是通过心电图对心律失常进行分析,但是这种方法需要医生具备专业的知识和经验,而且容易出现误诊。而人工智能技术可以对心…

倾斜摄影三维模型OSGB格式转换3DTILES的关键技术浅析

倾斜摄影三维模型OSGB格式转换3DTILES的关键技术浅析 将三维模型从OSGB格式转换为3DTILES格式需要掌握以下关键技术: 1、数据结构转换:OSGB格式和3DTILES格式采用了不同的数据结构,因此需要进行数据结构转换。OSGB格式采用了分层划分数据结构…

D3.js(3) path/折线图

一、概念 path 元素是用来绘制各种形状(例如线条、曲线、弧形、圆弧等)的元素。path 元素的 d 属性用来定义绘制的路径。具体来说,d 属性是一个字符串,包含一系列的命令和参数,用来描述路径的形状。 1.1 d属性 Mmov…

Linux子进程信号处理机制

Linux中子进程的信号处理与父进程的联系有以下三条: fork后子进程会继承父进程绑定的信号处理函数(很好解释,子进程会拷贝父进程的代码,包括信号处理函数)如果子进程调用exec族函数,子进程代码段被新的程序…

Qt 项目Mingw编译器转换为VS编译器时的错误及解决办法

错误 在mingw生成的项目,转换为VS编译器时通常会报些以下错误(C4819警告,C2001错误,C2143错误) 原因及解决方式 这一般是由于字符编码引起的,在源代码文件中包含了中文字符导致的。Qt Creator 生成的代码文…

算法的时间复杂度和空间复杂度分析

文章目录 实验目的实验内容实验过程运行结果复杂度分析 实验目的 通过本次实验,了解算法复杂度的分析方法,掌握递归算法时间复杂度的递推计算过程。 实验内容 二路归并排序的算法设计和复杂度分析。 实验过程 1.算法设计 归并排序:是指将…

活动回顾|多模态 AI 开发者的线下聚会@深圳站(内含福利)

回顾来了! 4 月 22 日,由 Jina AI 和 OpenMMLab 联合主办的 「多模态 AI 」Office Hours 深圳站圆满结束,迎来了将近 60 位开发者的热情参与!现场不仅有别开生面的「开发者集市」供大家打卡赢取好礼,更有四场干货满满的…

传统机器学习(六)集成算法(1)—随机森林算法及案例详解

传统机器学习(六)集成算法(1)—随机森林算法及案例详解 1、概述 集成学习(Ensemble Learning)就是通过某种策略将多个模型集成起来,通过群体决策来提高决策准确率。 集成学习首要的问题是选择什么样的学习器以及如何集成多个基学习器&…

杂谈 看唯工具论的问题 与 瑞典马工的一些言论 如何辩证看

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

华为OD机试真题(Java),根据员工出勤信息,判断本次是否能获得出勤奖(100%通过+复盘思路)

一、题目描述 公司用一个字符串来标识员工的出勤信息 absent:缺勤late:迟到leaveearly:早退present:正常上班 现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下: 缺勤不超过1次没…

闲聊之π和e到底是个啥

π和e 1. 圆周率π 耳熟能详的π,到底是什么,怎么来的? 圆周率π,圆的周长C2πr,其中r是圆的半径 1.1 刘徽割圆术 如图中所示,作出圆内的正十二边形,正二十四边形,…,用…

倾斜摄影三维模型OSGB格式 到OBJ 格式转换几个软件操作方法

倾斜摄影三维模型OSGB格式 到OBJ 格式转换几个软件操作方法 倾斜摄影三维模型是一种重要的三维地理信息数据,通常以OSGB格式保存。但在不同的三维软件中使用时,需要将其转换为更通用的OBJ格式。本文将介绍在技术上如何将OSGB格式的倾斜摄影三维模型转换为…

手机投屏到电脑的实用工具

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 背景说明 最近在项目开发工作中需要将手机屏幕投影到PC端,并通过PC端操作手机。为了满足该项开发需求,在项目小组中采用了Vysor作为工具。 Vysor介…