06_es分布式搜索引擎2

一、DSL查询文档

1.DSL查询分类

①查询所有:match_all

②全文检索:利用分词器对用户输入的内容分词,倒排索引去匹配

    match_query

    multi_match_query

③精确查询:根据精确词条查找数据,查找的是keyword,数值,日期,boolean类型字段

    ids,range,term

④地理geo查询:根据经纬度查询

    geo_distance

    geo_bounding_box

⑤复合查询:将各种条件组合起来,合并查询条件

    bool

    function_score

 总结:查询DSL的基本语法是什么?

GET /索引库名/_search

{ "query": { "查询类型": { "FIELD": "TEXT"}}}

2.全文检索

全文检索查询,会对用户输入内容进行分词。用于搜索框搜索

 ①match查询:对用户输入的内容分词,然后倒排索引库查询。一个字段

查询三钻的酒店

GET /hotel/_search
{"query": {"match": {"starName": "三钻"}}
}

②multi_match:多个字段查询。参与的字段越多,查询性能越差。

 查询品牌,酒店名,商业圈有“外滩如家”

GET /hotel/_search
{"query": {"multi_match": {"query": "外滩如家","fields": ["brand","name","business"]}}
}

3.精确查询

查询的keyword,不进行分词的字段

①term:根据词条准确值查询

②range:范围查询(价格)

 ①term:

查询品牌是“7天酒店”

GET /hotel/_search
{"query": {"term": {"brand": {"value": "7天酒店"}}}
}

②range:

查询200-250酒店

GET /hotel/_search
{"query": {"range": {"price": {"gte": 200,"lte": 250}}}
}

总结:精确查询常见的有哪些?

  • term查询:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段
  • range查询:根据数值范围查询,可以是数值、日期的范围

4.地理查询

场景:

查询附近的酒店,附近的人,打车附近的出租车

 ①矩形范围内:geo_bounding_box

 ②以指定中心点为半径:

 查询这个点15公里范围内的酒店

GET /hotel/_search
{"query": {"geo_distance":{"distance":"15km","location":"31.282444,121.479385"}}
}

5.相关性算分:竞价排名

①fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名

 

 ②词条频率越高,得分越高,排名越靠前

 

③elasticsearch中的相关性打分算法是什么?

  • TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
  • BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平

 

 

6.修改相关性算分:竞价排名

使用 function score query,可以修改文档的相关性算分(query score),根据新得到的算分排序。

 

①原始条件查询,搜索文档并根据相关性打分(query score)

②过滤条件:符合条件的文档才重新算分

③算分函数:

算分函数,算分函数的结果称为function score ,将来会与query score运算,得到新算分,常见的算分函数有:

  • weight:给一个常量值,作为函数结果(function score)
  • field_value_factor:用文档中的某个字段值作为函数结果
  • random_score:随机生成一个值,作为函数结果
  • script_score:自定义计算公式,公式结果作为函数结果

④加权模式,定义function score与query score的运算方式,包括:

  • multiply:两者相乘。默认就是这个
  • replace:用function score 替换 query score
  • 其它:sum、avg、max、min

案例:搜索外滩的酒店,“如家”品牌给公司充钱了,让他的排名靠前一些。

分析:

①文档为品牌是“如家”的

②算分函数是weight

③加权模式是求和sum

GET /hotel/_search
{"query": {"function_score": {"query": {"match": {"all": "外滩"}},"functions": [{"filter": {"term": {"brand": "如家"}},"weight": 2}],"boost_mode": "sum"}}
}

7.复合查询Boolean Query

布尔查询是一个或多个查询子句的组合。子句组合方式:

must:”与”,必须匹配每个子查询

should:“或”选择性匹配子查询

must_not:必须不匹配,不参与算分,类似“非”

filter:必须匹配,不算分。

案例1:查询上海的酒店,品牌是皇冠假日或华美达。价格不低于500,评分是大于45分的

 

 案例2:搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店。

GET /hotel/_search
{"query": {"bool": {"must": [{"match": {"name": "如家"}}],"must_not": [{"range": {"price": {"gte": 400}}}],"filter": [{"geo_distance": {"distance": "10km","location": {"lat": 31.21,"lon": 121.5}}}]}}
}

二、搜索结果处理

1.排序

es支持对搜索结果排序,默认是根据相关度算分(_score)排序。可以排序的字段:keyword类型,数值类型,地理坐标类型,日期类型。

排序语法

 地理坐标排序语法

 案例1:对酒店数据按照用户评价降序排序,评价相同的按照价格升序排序

GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"score":"desc"},{"price": "asc"}]
}

案例2:实现对酒店数据按照到你的位置坐标的距离升序排序

获取经纬度的方式:https://lbs.amap.com/demo/jsapi-v2/example/map/click-to-get-lnglat/

GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": {"lat": 31.220393,"lon": 121.544427},"order": "asc","unit": "km"}}]
}

2.分页

es的搜索结果默认是top10条。

es通过修改from,size参数控制返回的分页结果

 

深度分页问题

ES是分布式的,所以会面临深度分页问题。例如按price排序后,获取from = 990,size =10的数据:

 

①首先在每个数据分片上都排序并查询前1000条文档。

②然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档

③最后从这1000条中,选取从990开始的10条文档

如果搜索页数过深,或者结果集(from + size)越大,对内存和CPU的消耗也越高。因此ES设定结果集查询的上限是10000

总结

from + size:

  • 优点:支持随机翻页
  • 缺点:深度分页问题,默认查询上限(from + size)是10000
  • 场景:百度、京东、谷歌、淘宝这样的随机翻页搜索

after search:

  • 优点:没有查询上限(单次查询的size不超过10000)
  • 缺点:只能向后逐页查询,不支持随机翻页
  • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页

3.高亮

搜索关键字突出显示。

原理:

①搜索关键字标记出来

②页面加css样式

案例:如家酒店高亮

 

 

三、RestClient查询文档

1.快速入门

①请求DSL的组织

 RestAPI中其中构建DSL是通过HighLevelRestClient中的resource()来实现的,其中包含了查询、排序、分页、高亮等所有功能

 RestAPI中其中构建查询条件的核心部分是由一个名为QueryBuilders的工具类提供的,其中包含了各种查询方法

 ②解析结果response

③查询全部酒店的完整代码

 

@Test
void testMatchAll() throws IOException {// 1.准备查询请求,参数是索引库名SearchRequest request = new SearchRequest("hotel");// 2.组织DSL参数request.source().query(QueryBuilders.matchAllQuery());// 3.发送请求,得到响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.解析结果SearchHits searchHits = response.getHits();// 4.1 获取查询的条数long total = searchHits.getTotalHits().value;// 4.2 获取查询的集合SearchHit[] hits = searchHits.getHits();// 4.3 遍历List<HotelDoc>hotelDocList = new ArrayList<>();for (SearchHit hit : hits) {// 转换为JsonString json = hit.getSourceAsString();// 转换为java对象HotelDoc hotelDoc = JSONObject.parseObject(json, HotelDoc.class);// 保存在集合中hotelDocList.add(hotelDoc);}System.out.println(hotelDocList);
}

查询的基本步骤是:

  • 创建SearchRequest对象
  • 准备Request.source(),也就是DSL。
    • QueryBuilders来构建查询条件
    • 传入Request.source() 的 query() 方法
  • 发送请求,得到结果
  • 解析结果(参考JSON结果,从外到内,逐层解析)

2.构建查询条件,只要记住一个类:QueryBuilders

①全文检索查询(分词,模糊查询)

单字段:QueryBuilders.matchQuery(字段名,值)

多字段:QueryBuilders.multiMatchQuery(值, 字段1,字段2);

演示:酒店名字带有“如家“的有哪些?

request.source().query(QueryBuilders.termQuery("name","如家"));

②精确查询,不分词

精确查询常见的有term查询和range查询

③复合查询boolean query

查询品牌为如家,价格在200元内的酒店

// 创建bool查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加must条件
boolQuery.must(QueryBuilders.termQuery("brand","如家"));
// 添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(200));
request.source().query(boolQuery);

3.分页和排序

 演示:查询名为“如家“的酒店,查询结果进行价格降序,每页显示3条

// 页码
int page = 1,size=3;
// 2.组织DSL
// 2.1 查询
request.source().query(QueryBuilders.termQuery("name","如家"));
// 2.2 分页 从from序号数size个
request.source().from((page-1)*size).size(size);
// 2.3 价格排序
request.source().sort("price", SortOrder.DESC);

4.高亮

根据name搜索高亮

 代码

@Test
void testHight() throws IOException{// 1.请求requestSearchRequest request = new SearchRequest("hotel");// 2. 组织DSLrequest.source().query(QueryBuilders.matchQuery("all","如家"));request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));// 3.发送请求,得到响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.分析结果SearchHits searchHits = response.getHits();// 5.解析SearchHit[] hitss = searchHits.getHits();// 6.遍历for (SearchHit hit : hitss) {// 转换为jsonString json = hit.getSourceAsString();// 得到对象HotelDoc hotelDoc = JSONObject.parseObject(json, HotelDoc.class);// 获取高亮结果Map<String, HighlightField> highlightFields = hit.getHighlightFields();// 根据字段获取HighlightField highlightField = highlightFields.get("name");// 获取高亮值String name = highlightField.getFragments()[0].string();// 覆盖结果hotelDoc.setName(name);System.out.println(name);}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握口才与演讲技巧,让你职场中脱颖而出

在职场竞争日趋激烈的今天&#xff0c;口才和演讲能力已经成为一个人成功的重要标志之一。掌握了优秀的口才与演讲技巧&#xff0c;不仅可以帮助你在工作中更好地表达自己和传达信息&#xff0c;同时也可以让你在同事和上级心中留下深刻印象&#xff0c;从而在职场中脱颖而出&a…

JVM修炼印记之初识

文章目录 JVM认识JVM的功能常见JVMHotSpot的发展历程 JVM认识 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是一个用于执行Java字节码的虚拟计算机。它是Java语言的核心&#xff0c;可以在不同的操作系统和硬件平台上运行Java程序。 JVM负责将Java…

C++——类和对象(中)完结

赋值运算符重载 运算符重载 C 为了增强代码的可读性引入了运算符重载 &#xff0c; 运算符重载是具有特殊函数名的函数 &#xff0c;也具有其 返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键…

[GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号、数字被过滤绕过&#xff08;ctfshow web入门370&#xff09;-CSDN博客 ssti板块注入 正好不会 {%%}的内容 学习一下 经过测试 发现过滤了 {{}} 那么我们就开始吧 我们可以通过这个语句来查询是否存在ss…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

【Linux笔记】Linux进程概念与进程状态

【Linux笔记】Linux进程概念与进程状态 一、什么是进程1.1、进程的概念1.2、进程的描述 二、关于进程的一些基本操作2.1、查看进程2.2、杀进程2.3、获取进程id2.4、创建进程 三、进程状态3.1、普适操作系统中的进程状态3.2、具体到Linux操作系统中的进程状态 四、僵尸进程和孤儿…

SpringMVC简单介绍与使用

目录 一、SpringMVC介绍 二、SpringMVC作用 三、SpringMVC核心组件 四、SpringMVC快速体验 一、SpringMVC介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff…

数据库概论

目录 什么是数据库数据库的概念模型层次模型网状模型关系模型 为什么要使用关系型数据库完整性约束结构化查询语言SQL基本语句 什么是数据库 考虑这些问题&#xff1a;当用户使用软件计算时&#xff0c;如果想要保存计算结果或者想选择不同的题目&#xff0c;是否要保存、读取…

多特征线性回归模型

一、预测目标和原始数据展示 (一)预测目标: 通过Economy..GDP.per.Capita.(GDP)和Freedom预测Happiness.Score (二)部分数据展示: 特征有很多&#xff0c;本文研究Economy..GDP.per.Capita.(GDP)和Freedom&#xff0c;也就是用Economy..GDP.per.Capita.(GDP)和Freedom预测Happ…

[计算机提升] Windows系统软件:娱乐类

3.3 系统软件&#xff1a;娱乐类 3.3.1 Windows Media Player&#xff1a;dvdplay Windows Media Player是Windows操作系统自带的多媒体播放软件&#xff0c;用于播放和管理电脑中的音频和视频文件。它提供了以下功能&#xff1a; 播放音频和视频文件&#xff1a;Windows Med…

OpenGL_Learn04

我这边并不是教程&#xff0c;只是学习记录&#xff0c;方便后面回顾&#xff0c;代码均是100%可以运行成功的。 1. 渐变三角形 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <cmath>void framebuffer_size_callba…

修改element组件库的el-input-number的图标

官方样式&#xff1a; 我希望组件的图标改成一对上下是三角形的图标&#xff1a; 直接复制以下代码&#xff1a; ::v-deep .el-icon-arrow-down:before {content: "\e790"; } ::v-deep .el-icon-arrow-up:before {content: "\e78f"; } 完成&#xff01…

2021-arxiv-GPT Understands, Too

2021-arxiv-GPT Understands, Too Paper&#xff1a; https://arxiv.org/abs/2103.10385 Code&#xff1a; https://github.com/THUDM/P-tuning Prompt 简单理解 举例来讲&#xff0c;今天如果有这样两句评论&#xff1a; 1. 什么苹果啊&#xff0c;都没有苹果味&#xff0c…

ViT Vision Transformer超详细解析,网络构建,可视化,数据预处理,全流程实例教程

关于ViT的分析和教程&#xff0c;网上又虚又空的东西比较多&#xff0c;本文通过一个实例&#xff0c;将ViT全解析。 包括三部分内容&#xff0c;网络构建&#xff1b;orchview.draw_graph 将网络每一层的结构与输入输出可视化&#xff1b;数据预处理。附完整代码 网络构建 …

偶数矩阵判断【C语言作业】

题目 若一个布尔矩阵所有行和所有列的和都是偶数&#xff0c;则称为偶数矩阵。请编写一个程序&#xff0c;判断一个布尔矩阵是否是偶数矩阵。 要求&#xff1a; &#xff08;1&#xff09;输入:首先输入一个正整数n(n<100),代表该矩阵的大小&#xff0c;接下来是n行n列的矩…

第5天:基础入门-资产架构amp;端口amp;应用amp;CDNamp;WAFamp;站库分离amp;负载均衡

第5天&#xff1a;基础入门-资产架构&端口&应用&CDN&WAF&站库分离&负载均衡 #知识点&#xff1a;1. 资产架构-端口&目录&插件接口&多站点&多应用 2. 番外安全-域名&服务器本身&服务厂商&管理人员 3. 考虑阻碍-站库分离&am…

c++-AVL树

文章目录 前言一、AVL树1、AVL树概念2、AVL树模拟实现3、AVL树的旋转操作3.1 左单旋3.2 左单旋代码实现3.3 右单旋3.4 右单旋代码实现。3.5 什么时候调用左单旋和右单旋3.6 左右双旋3.7 左右双旋代码实现3.8 右左双旋3.9 右左双旋代码实现3.10 什么时候调用左右双旋和右左双旋 …

Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器

文章目录 引言Kafka Eagle简介Kafka Eagle的特点Kafka Eagle的优势使用Kafka Eagle的步骤结论 引言 在现代大数据架构中&#xff0c;Apache Kafka已成为一个不可或缺的组件&#xff0c;用于可靠地处理和传输大规模的数据流。然而&#xff0c;随着Kafka集群规模的不断增长&…

编写shell脚本,利用mysqldump实现MySQL数据库分库分表备份

查看数据和数据表 mysql -uroot -p123456 -e show databases mysql -uroot -p123456 -e show tables from cb_d 删除头部Database和数据库自带的表 mysql -uroot -p123456 -e show databases -N | egrep -v "information_schema|mysql|performance_schema|sys"编写…

Linux之sched_setscheduler调度策略总结(六十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…