Elasticsearch:DSL Query

article/2025/10/16 18:25:00

Query DSL的分类

Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:

  • 查询所有:查询出所有的数据,一般测试用,例如:match_all,但有分页限制,一次20条左右
  • 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。常见的有两种
    • match_query
    • multi_match_query
  • 精确查询:根据精确词条值查找数据,一般查找keyword、数值、日期、boolean等类型字段。(不需要分词,整体做倒排索引)
    • ids (按照id查询)
    • range (按照数值范围查询)
    • term (按照数据的值查询)
  • 地理(geo)查询:根据经纬度查询,例如:
    • geo_distance
    • geo_bounding_box
  • 复合(compound)查询:符合查询可以将上述各种查询条件组合起来,合并查询条件
    • bool
    • function_score

DSL Query基本语法
查询的基本语法如下:

GET /indexName/_search
{"query":{"查询类型":{"查询条件":"条件值"}}
}

查询所有

GET /indexName/_search
{"query":{"match_all":{}}
}

全文检索查询

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

  • match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索。
    语法
GET /indexName/_search
{"query":{"match":{"字段":"搜索的内容"}}
}

实例

GET /es_test/_search
{"query":{"match":{"name.lastName":"张"}}
}

结果

{"took" : 5,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.2876821,"hits" : [{"_index" : "es_test","_type" : "_doc","_id" : "1","_score" : 0.2876821,"_source" : {"info" : "测试es","email" : "xxx@163.com","name" : {"firstName" : "三","lastName" : "张"},"age" : 16}}]}
}

查询所有

GET /es_test/_search
{"query":{"match":{"all":"张"}}
}
  • multi_match:与match查询类似,允许同时查询多个字段,即从对应的字段中查询匹配的内容。参与查询字段越多,查询性能越差,建议使用copy_to将多个要查的字段copy到一个字段。
    语法
GET /indexName/_search
{"query":{"mutil_match":{"query":"要查询的内容","fields":["字段1","字段2"]}}
}

精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。
常见的有:

  • term:根据词条精确值查询
    语法
GET /indexName/_search
{"query":{"term":{"FIELD":{"value":"VALUE"}}}
}

例子

GET /es_test/_search
{"query":{"term":{"age":{"value":"16"}}}
}
  • range:根据值的范围查询
    语法
GET /indexName/_search
{"query":{"range":{"FIELD":{"gte":10,"lte":20}}}
}

例子

GET /es_test/_search
{"query":{"range":{"age":{"gte":10,"lte": 20}}}
}

地理查询

根据经纬度查询,常见的使用场景:查询附近的酒店,查询附近的出租车,搜索附近的人

  • geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
GET /indexName/_search
{"query": {"geo_bounding_box":{"FIELD1":{"top_left":{"lat":31.1,"lon":121.5}},"FIELD2":{"bottom_right":{"lat":30.9,"lon":121.7}}}}
}
  • geo_distance:查询到指定中心点小于某个距离值的所有文档
GET /indexName/_search
{"query": {"geo_distance":{"distance":"15km","FIELD":"31.21,121.5"}}
}

复合查询

复合(compound)查询,可以将其他简单查询组合起来,实现更复杂的搜索逻辑,例如:

  • function score:算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价

相关性打分算法
当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用function score query,可以修改文档的相关性算分(query score),根据新得到的算分排序。

GET /indexName/_search
{"query": {"function_score": {"query": {"match": {"all": "外滩"} // 原始查询条件,搜索文档并根据相关性打分(query score)},"functions": [{"filter": {"term":{"id": "1"}}, //过滤条件,符合条件的文档才会被重新算分"weight":10 //算分函数,算分函数的结果称为function score,将来会与query score运算,得到新分数,常见的算分函数有:weight:给一个常量值,作为函数结果(function score);field_value_factor:用文档中的某个字段值作为函数结果;random_score:随机生成一个值,作为函数结果;script_score:自定义计算公式,公式结果作为函数结果}]},"boost_mode":"multiply"//加权模式,定义function score与query score的运算方式,包括:multiply:两者相乘,默认就是这个;replace:用function score替换query score;其他:sum,avg,max,min}
}
  • 布尔查询,是一个或多个查询子句的组合。子查询的组合方式有:
  • must:必须匹配每个子查询,类似"与"
  • should:选择性匹配子查询,类似"或"
  • must_not:必须不匹配,不参与算分,类似"非"
  • filter:必须匹配,不参与算分
GET /indexName/_search
{"query": {"bool": {"must": [{"term": {"city": "上海"}}],"should": [{"term": {"brand": "皇冠假日"}},{"term": {"brand": "华美达"}}], "must_not": [{"range": {"price": {"lte": 500}}}],"filter": [{"range": {"score": {"gte": 45}}}]}}
}

Reference
黑马程序员


http://chatgpt.dhexx.cn/article/JW2cQxyk.shtml

相关文章

SpringBoot+Querydsl 框架,大大简化复杂查询操作

概述 本篇博客主要将介绍的是利用spring query dsl框架实现的服务端查询解析和实现介绍。 查询功能是在各种应用程序里面都有应用,且非常重要的功能。用户直接使用的查询功能往往是在我们做好的UI界面上进行查询,UI会将查询请求发给查询实现的服务器&a…

QueryDSL 关于Q类找不到的问题

先编译代码,如果是在idea中,光标移动到项目上,F4,让后如图操作 回到项目中编码,就可以找到Q类了

JPA 之 QueryDSL-JPA 使用指南

Querydsl-JPA 框架(推荐) 官网:传送门 参考: JPA整合Querydsl入门篇SpringBoot环境下QueryDSL-JPA的入门及进阶 概述及依赖、插件、生成查询实体 1.Querydsl支持代码自动完成,因为是纯Java API编写查询&#xff0…

使用spring data Querydsl 实现动态查询功能

Table of Contents 概述 定义查询请求 google-like查询 特定字段的类sql查询 使用Spring Data Querydsl 利用Spring Query DSL实现动态查询 实现过程中的难题 主表包含多个子表数据时的AND查询 概述 本篇博客主要将介绍的是利用spring query dsl框架实现的服务端查询解…

关于 QueryDSL 配置和使用(详细)

关于 QueryDSL 最近写项目,使用到了 Jpa 这个 ORM 规范支持,使用注解的方式实现 Sql ,但是用过 Jpa 的同学都知道 Jpa 对于单表操作很灵活,但是对于复杂一些的 SQL 就是很不友好了,所以这个地方我们就用到了 QueryDSL…

Spring Boot配置QueryDSL(生成Query查询实体类,查询数据)

1 QueryDSL QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。 Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者是SQL的查询语句,也就是说QueryDSL是基于各种ORM框架以及SQL之上的一个通用的查询框架…

微信开发之服务号设置

服务号设置 公众号开发主要用到AppID AppSecret 以下操作前提是,服务号已认证 在开发基本设置里 设置开发者模式开启设置appSecret 需要管理员扫码设置ip白名单 需要管理员扫码服务器配置启用,填写服务器验证地址 在开发者工具,web开发者工具…

微信服务号开发

最近终于完成了团队微信服务号的开发,深深的喘了一口气,还记得在差不多10天前,我们几个为了参加学校服务外包大赛的队友一起讨论选题,最终确定了以微信为基底开发一个人力资源管理系统的微信公众平台,几天后&#xff0…

微信开发公众号

背景: 过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。 文章目录 一、注册公众号二、了解公众号管理页面三、必备开发者工具的使用1.开发者文档2.在线接口调试工具3.web开…

微信服务号Java开发(一)

发送模板消息 1. 服务器配置 解析:微信发送一个get请求,并携带4个参数:signature、timestamp、nonce、echostr。开发者需要验证该请求是否来源于微信,验证方法: 1)将token、timestamp、nonce三个参数进行字…

微信公众号之接入微信公众号服务器开发(二)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/85319116 一丶叙述 开发说明 Python代码实现&…

教你3分钟快速开发微信公众号[订阅号][服务号]

Wx-tools是基于微信公众平台API的轻量级框架。 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台。 博主最近终于有空!!已经更新到2.0.0啦!! GitHub仓库 下载wx-tools-2.0.0.jar wx-tools开发文档 大三做过几个基于…

微信公众号开发之配置开发服务器

微信公众号开发详细教程 微信公众号开发文档 需不需要开发服务器应该根据自己的业务需求来决定。如果你只是简单使用微信公众号,发送推文等简单需求,你就不需要的配置自己的开发服务器,微信公众号平台功能十分强大,不懂技术的用…

微信服务号的开发-服务器配置

微信服务号开发-服务器配置 本期是将微信开发第一步,也就是服务器配置,以及校验。 话不多说,我们主要讲重点。既然是微信服务号开发,首先我们需要一个测试号,大家可以自己去微信公众平台申请一个。 申请完后&#xff…

微信公众号开发:服务器配置(Java)

由于项目需要微信公众号的开发,弄了老半天,发现也不是那么难弄。 对于微信公众号开发,首先要有开发者权限然后进行基本的配置。 登录进微信公众号平台,首页最下面有个基本配置: 进入基本配置后,会看到两个…

微信公众号开发——服务器配置

一、前提 1、购买一台云服务器 域名解析 这里用的宝塔服务 创建域名 绑定到指定的目录 wx.php 代码如下 <?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj new wechatCallbackap…

微信公众号开发--服务号

前言 因公司需要开发一款手机打卡程序&#xff0c;本人没有安卓APP开发经验&#xff0c;所以决定将写个服务号的公众号&#xff0c;集外出打卡&#xff0c;打卡查询等功能; 一&#xff0c;开发前测试帐号申请 以下是官方给出的建议&#xff0c;大家可以多参考参考 1&#xf…

如何使用开发者服务器运维微信公众号

文章目录 1 如何把微信公众号授权给开发者服务器2 如何使用代码把开发者服务器与微信服务器进行关联 很多人都有自己的服务器&#xff0c;特别是对于大学生而言&#xff0c;很多服务器公司都对学生有优惠&#xff0c;例如腾讯云只要1元每月&#xff1a;http://blog.csdn.net/ti…

python 微信公众号开发[1] 后台服务器端配置与公众号开发配置

更新时间&#xff1a;2020年3月7日 微信公众号开发的硬件必备条件&#xff1a;&#xff08;1&#xff09;申请一个公众号 &#xff08;2&#xff09;有公网ip的服务器&#xff08;最好是阿里云&#xff0c;腾讯云等的云服务器&#xff09;&#xff08;3&#xff09;解析到&…

微信小程序微信服务号开发微信公众平台开发前端开发框架

1、Frozen UI 手Q出品&#xff0c;组件更丰富&#xff0c;视觉舒适度也不错&#xff0c;适合我这种前端较生疏&#xff0c;需要开箱即用的程序员。 推荐度&#xff1a;5星 演示地址&#xff1a;FrozenUI Demo 2、WeUI 官方出品&#xff0c;情怀满满&#xff0c;但是组件不够用。…