elasticsearch-DSL高级查询语法
DSL语句查询
查询字符串搜索便于通过命令行完成特定(ad hoc)的搜索,但是它也有局限性(参阅简单搜索章节)。Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现
文本查询语法
模糊匹配
如搜索奥迪,会查出包含奥迪A8L 和 奥迪 和 A8L 都查询出来,按照词进行查询
GET /sunny/user/_search
{
"query": {
"match": {
"car": "奥迪A8L"
}
}
}
短语匹配
match_phrase-短语匹配:如 搜索"奥迪A8L" 不会查出包含 "奥迪" OR "A8L" 只会查出包含 "奥迪A8L"的记录
GET /sunny/user/_search
{
"query": {
"match_phrase": {
"car": "奥迪A8L"
}
}
}
多字段匹配
multi_match-多字段匹配:如 搜索"小云" 只要name或者car字段中包含 "小云" OR "小" OR "云" 等分词都会被查找出来
GET /sunny/user/_search
{
"query": {
"multi_match": {
"query": "小云",
"fields":["name","car"]
}
}
}
分页模糊查询
from:第几页 size:每页N条数据
GET /sunny/user/_search
{
"from":0,
"size":1,
"query": {
"match": {
"car": "奥迪"
}
}
}
高亮搜索
会将要查询到值,高亮显示成 拆分成几个词进行查询
GET /sunny/user/_search
{
"query" : {
"match_phrase" : {
"car" : "奥迪A8L"
}
},
"highlight": {
"fields" : {
"car" : {}
}
}
}
结构查询语法
精确匹配
term-将按照存储在倒排索引中的确切字词进行操作,这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,它们允许您制作低级查询,并在分析过程之前进行
GET /sunny/user/_search
{
"query":{
"term": {
"age": 48
}
}
}
range范围查询(1)
如查询age大于等于20小于等于30的记录
GET /sunny/user/_search
{
"query": {
"range": {
"age":{
"gte":20,
"lte":30
}
}
}
}
range范围查询(2)
如查询age大于20小于30的记录
GET /sunny/user/_search
{
"query": {
"range": {
"age":{
"gt":20,
"lt":30
}
}
}
}
range范围查询(3)
时间范围查询 now:当前时间
GET /sunny/user/_search
{
"query": {
"range": {
"createDate":{
"gte":"2019-05-05",
"lte":"now"
}
}
}
}
布尔查询
》比如,query的时候,会先比较查询条件,然后计算分值,最后返回文档结果; 而filter则是先判断是否满足查询条件,如果不满足,会缓存查询过程(记录该文档不满足结果);满足的话,就直接缓存结果。 综上所述,filter快在两个方面: 1 对结果进行缓存 2 避免计算分值
为下面查询socre了解做简单的铺垫
elasticsearch的搜索评分逻辑。
查询的权重基于三个因素:词频、逆向文档频率和字段长度归一值。
词频:查询词在该文档中出现的频率。频率越高,权重越高。
逆向文档频率:查询词在所有文档中出现的频率。频率越高,权重越低。可以降低日常使用的高频率词的权重。
字段长度归一值:查询字段的长度。字段长度越长,查询词权重越高,反之越低。
进一步细节说:我们查询的所有文档,会在内部做一次相关性的评分score;然后会根据这个score从大到小的排序,依次展示给客户端
如何计算评分?
Elasticsearch使用的计算评分公式TF-IDF算法的实用计算公式如下:
score(q,d) coord(q,d)queryNorm(q)(tf (tind)idf (t)2 boost(t)norm(t,d))
filter过滤查询
判断是否满足精确查找条件,满足或不满足,做数据过滤,es会对结果进行缓存
查询的结果必须匹配查询条件,和must不同不会计算score
GET /sunny/user/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"age": "48"
}
}
]
}
}
}
must查询必须同时满足我所有条件
例如:文档字段中,age为48 和 name为小名,视图返回给用户 查询的结果必须匹配查询条件,并计算score
GET /sunny/user/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"age": "48"
}
},
{
"match": {
"name": "小名"
}
}
]
}
}
}
must_not查询不满足条件
例如:查不年龄不等于48的记录 查询结果必须不符合查询条件
GET /sunny/user/_search
{
"query":{
"bool": {
"must_not": [
{
"match": {
"age": "48"
}
}
]
}
}
}
组合查询
例如:文档字段中,age为48 和 name为小名,视图返回给用户,且过滤条件精准查询sex必须为0,视图返回给用户
GET /sunny/user/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"age": "48"
}
},
{
"match": {
"name": "小名"
}
}
],
"filter": [
{
"term": {
"sex": "0"
}
}
]
}
}
}
constant_score复合查询
将查询内部的结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分(将查询的评估固定下来,不支持match,只支持filter)、布尔查询
GET /sunny/user/_search
{
"query": {
"constant_score": {
"filter":{
"match":{
"age":48
}
}
}
}
}
自定义分数查询
常量分值查询,目的就是返回指定的score,一般都结合filter使用,因为filter context忽略score 查询结果 1 > 3 分数值一样
GET /sunny/user/_search
{
"query": {
"constant_score": {
"filter": {
"match": {
"car":"奥迪"
}
},
"boost": 3
}
}
}
should查询
至少满足一个条件 查询age包含48 或者 car包含奥迪的数据
GET /sunny/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"age": "48"
}
},
{
"match": {
"car": "奥迪"
}
}
]
}
}
}
聚合查询->group by
#根据年龄字段分组查询
GET /sunny/user/_search
{
"aggs": {
"group_by_age": {
"terms": {
"field": "age"
}
}
}
}
#根据条件分组
GET /sunny/user/_search
{
"query": {
"match": {
"car": "奥迪"
}
},
"aggs": {
"group_by_age": {
"terms": { "field": "age" }
}
}
}
#分组并求平均值
GET /sunny/user/_search
{
"aggs": {
"group_by_age": {
"terms": { "field": "age" },
"aggs" : {
"avg_age" : {
"avg" : { "field" : "age" }
}
}
}
}
}
- 每周算法练习——大数的乘法问题
- Java基础-25(01)图形用户界面编程GUI
- 每周算法练习——n皇后问题
- dg broker配置的问题及分析 (r7笔记第22天)
- 备库搭建中的一波三折(r7笔记第21天)
- Java基础-25(02)图形用户界面编程GUI
- 每周算法练习——最近对问题
- Java基础-25(03)图形用户界面编程GUI
- 数据结构和算法——用动态规划求解最短路径问题
- 备库报警邮件的分析案例(一) (r7笔记第14天)
- 数据结构和算法——动态规划
- Java基础-25(05)图形用户界面编程GUI
- Java基础-25(06)图形用户界面编程GUI
- 51. Socket服务端和客户端使用TCP协议通讯 | 厚土Go学习笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LoRa终端设备ASR6505普通GPIO操作
- LoRa终端设备ASR6505之I2C通信
- 我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
- LoRa终端设备ASR6505之PingPong通信
- LoRa点对点通信,OLED显示(内附代码)
- 08 . Python3高阶函数之迭代器、装饰器
- redis源码之SDS
- 01 . Tomcat简介及多实例部署
- 学练结合,快速掌握Kubernetes Service
- arraylist linkedlist vector
- Java的HashMap和HashTable
- 花木兰到底好看不,我用Python爬取了几万条评论!
- java方法重载
- java中super()和this()浅析
- 常见的 Spring 注解概览