DSL查询文档

news/2024/11/30 7:49:33/

目录

  • 1、查询DSL基本语法
  • 2、基本查询类型
  • 3、复合查询FunctionScoreQuery
    • 案例:给名字为如家的品牌排名靠前一些
  • 4、Boolean Query查询
    • 案例:如家酒店,价格<=400,且在坐标10km范围内所有酒店
  • 5、指定排序字段
    • 案例:根据用户评价排序,评价相同则按照价格升序排序
    • 案例:根据经纬度排序附近的酒店
  • 6、分页
  • 7、搜索结果高亮处理

1、查询DSL基本语法

GET /索引库名/_search

{“query”:{

“查询类型”:{“FIELD”:“TEXT”}}

}

在这里插入图片描述

took:花费时间

time_out:花费时间

hits:击中的数据——>value:指的是多少个

下面那个hits是具体的数据

在这里插入图片描述

2、基本查询类型

全文检索查询

1.match类型:可以根据一个字段进行查询(字段为索引库创建时的约束字段)

#match查询
GET /hotel/_search
{"query":{"match": {"name": "外滩"}}
}GET /hotel/_search
{"query":{"match": {"business": "如家"} }
}

2.muti_match类型:可以根据多个字段进行查询,字段越多,效率越低

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

在这里插入图片描述

地理查询
在这里插入图片描述
在这里插入图片描述

3、复合查询FunctionScoreQuery

算分的算法介绍
FunctionScoreQuery:在原有查询基础上+打分

在这里插入图片描述
function score打分场景:比如在百度上,你进行搜索,向我们看到最前面的,都是广告投放的,也就是人工对文档进行了算分方面的控制;

打分与词条频率有关
在这里插入图片描述

实践: 1、query:原始的查询条件,会根据条件来得到我们想要的文档

2、过滤条件:filter->定义了哪些文档会被重新算分

3、算分函数:function score

在这里插入图片描述

4、那么fuction score(算分函数)和query score(原始打分)是怎么进行运算的呢?

通过boost_mode进行加权
在这里插入图片描述

比如说上面那个场景,假设我们查询出来的文档,它里面的词条根据默认的打分算法求得是0.5,那么根据算分函数,加权完后=10*0.5=5;

案例:给名字为如家的品牌排名靠前一些

在这里插入图片描述

流程:

1.首先,在query下定义一个function_score,我们根据算分搜索数据,query查询能够match到的文档(比如我们这里的name:“外滩”),里面包含符合的词条(并且用BM25算法默认打分)

2.然后,定义一个functions,里面是算分的方法:符合的才会被重新算分(filter),并且设置算分函数,比如weight…,

3.最后设置加权模式,重新算分的函数与之前query的打分进行一个加权

在这里插入图片描述

function score query分别定义三要素是什么?
在这里插入图片描述

4、Boolean Query查询

在这里插入图片描述

比如关键字的搜索,像酒店名字等等,可以放到must里面

must:必须匹配的条件,里面的条件会参与算分

should:选择性匹配,可以理解为“或”

must_not:像不是必须的,品牌这种keyword,不参与算分的就可以放到下面,直接根据条件筛

filter:与must一样,不过不参与打分

一般来说,我们都是将关键字,那些参与打分的字段放入must中,其余的在must_not或者Filter

案例:如家酒店,价格<=400,且在坐标10km范围内所有酒店

在这里插入图片描述

5、指定排序字段

elasticsearch默认是对搜索结果进行排序,按照相关的算分(_score)来排序——>也就是说默认是按照type=text的打分排序;

我们可以根据->不能打分(没有分词)的字段:像keyword类型、地理坐标、日期等类型进行结果排序;

注意:一旦发生了sort排序,打分失效

案例:根据用户评价排序,评价相同则按照价格升序排序

在这里插入图片描述

案例:根据经纬度排序附近的酒店

根据位置排序周围的酒店:

1.首先规定sort排序,因为是关于地理位置的排序,所以要设置_geo_distance

2.在_geo_distance里面确定基点位置location(经纬度)

3.排序方式order以及单位unit

在这里插入图片描述

6、分页

与query同级, 以下就是:按照价格降序,从第一条数据开始,看10条数据,如果我们要查第二页,直接from改为10即可;
在这里插入图片描述
深度分页问题

就比如场景:一个年级参加比赛,有尖子班和普通班(对应也就是ES集群两个分片),筛选最优秀的十个人参加比赛,你不可能是普通版参加十个,尖子班参加十个,因为你普通班的前十到尖子班可能就是倒数了,所以需要将结果聚合,重新筛选,选出最优秀的十个

在这里插入图片描述

from+size>10000会报错

在这里插入图片描述

深度分页解决方案:

在这里插入图片描述

scroll因为是快照,说明不能实时更新,那么海量数据获取更新就不行了,而且快照的话还要额外内存消耗,所以不是蛮推荐;

after search:没有查询上限(from+size有上限10000),只能向后翻页,不支持随机翻页,比如小说翻页;

from+size:百度京东、谷歌这种都是这样,<10000

7、搜索结果高亮处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/45458.html

相关文章

uniapp系列-使用uniapp携带收件人信息调用手机邮件应用发邮件的2种方案

背景描述 我们使用uniapp打包之后&#xff0c;某些情况下&#xff0c;需要使用uniapp打开手机其他应用去发邮件&#xff0c;携带对方email 信息以及主题信息等&#xff0c;那我们应该怎么处理呢&#xff1f; 方案一&#xff1a;使用uniapp标签-uni-link&#xff0c;注意这种方…

【STL十一】无序容器(哈希容器)—— unordered_map、unordered_set

【STL十一】无序容器&#xff08;哈希容器&#xff09;—— unordered_map、unordered_set 一、简介1、关联容器和无序容器不同2、无序容器特点 二、头文件三、模板类四、无序容器的内部结构1、管理桶2、内部结构 五、unordered_map成员函数1、迭代器2、元素访问3、容量4、修改…

Https详解

文章目录 一. 什么是 Https1. "加密"是什么?2. 对称加密3. 非对称加密4. "中间人攻击" 二. 引入证书理解签名黑客能否伪造证书?黑客能否替换公钥?黑客能否篡改签名?如何查看证书? 一. 什么是 Https https 就是 http 安全层(SSL)–> 用来加密的协…

【华为OD机试真题】字符串解密(javaC++python)100%通过率

字符串解密 知识点数组字符串排序 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 给定两个字符串string1和string2。 string1是一个被加扰的字符串。string1由小写英文字母(‘a’~‘z’)和数字字符 (‘0’~ ‘9’)组成,而加扰字符串由’0’~ ‘9’、‘a’~f’…

编程参考 - C语言中未定义宏的值

在C99标准中&#xff0c;可以查看到说明&#xff1a; 在6. Language -> 6.10 Preprocessing directives -> 6.10.1 Conditional inclusion里&#xff0c;第4点&#xff1a; After all replacements due to macro expansion and the defined unary operator have been pe…

Vue2_01_data_插值

插值语法 {{name}} data: vue实例的数据对象 data中数据变化时将重新渲染容器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--引入vue,引入之后vue.js 创建了一个全局变…

Lambda表达式:简介、语法和用法

Lambda表达式&#xff1a;简介、语法和用法 1. Lambda表达式概述2. Lambda表达式语法3. Lambda表达式用法1.遍历列表并输出每个元素2.筛选列表中的偶数并返回一个新列表3.将字符串转换为大写并返回一个新列表4.计算列表中所有元素的总和5.将列表中的元素转换为键值对并放入Map中…

( “树” 之 DFS) 404. 左叶子之和 ——【Leetcode每日一题】

404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1]…