Elasticsearch(ES)的DSL语法与搜索
发布于 2024-07-17
1384
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
springboot葵花宝典
扫码关注公众号
扫码阅读
手机扫码阅读
Elasticsearch DSL查询与搜索功能概述
1. DSL查询分类
Elasticsearch提供基于JSON的DSL语法来定义查询,主要包括以下类型:
- 查询所有:返回所有文档,常用于测试。
-
全文检索查询:通过分词器匹配词条,例如
match_query和multi_match_query。 -
精确查询:用于精确匹配关键词、数值、日期等字段,例如
term和range。 -
地理查询:基于经纬度匹配,例如
geo_distance和geo_bounding_box。 -
复合查询:组合多种查询条件,例如
bool和function_score。
2. 全文检索查询
全文检索通过分词器对用户输入内容进行分词并匹配倒排索引库,常见的使用场景包括搜索引擎、商城搜索、社交媒体等。
基本语法如下:
- match查询:单字段匹配。
- multi_match查询:多字段匹配。
示例:
GET /wineshop/_search
{
"query": {
"match": {
"business": "公园"
}
}
}
总结:match用于单字段查询;multi_match匹配多个字段,但性能会有所下降。
3. 精确查询
精确查询不会对搜索内容进行分词,适用于keyword、数值和日期字段。常见类型包括:
- term:精确匹配单个词条。
- range:匹配数值或日期范围。
示例:
GET /wineshop/_search
{
"query": {
"term": {
"city": {
"value": "北京上海"
}
}
}
}
4. 地理查询
地理查询用于根据经纬度匹配数据,常见场景包括附近酒店搜索、附近人查询等。
- geo_bounding_box:矩形范围查询。
- geo_distance:距离查询,基于圆形范围匹配。
示例:
GET /wineshop/_search
{
"query": {
"geo_distance": {
"distance": "15km",
"location": "31.242201,121.509106"
}
}
}
5. 复合查询
复合查询结合多种查询条件以实现复杂逻辑,主要包括:
- function_score:可调整相关性打分。
- bool:通过逻辑关系组合多个子查询。
示例:使用function_score提高某品牌酒店的排名:
GET /wineshop/_search
{
"query": {
"function_score": {
"query": {
"match": { "all": "外滩" }
},
"functions": [
{
"filter": { "term": { "brand": "七天" } },
"weight": 2
}
],
"boost_mode": "sum"
}
}
}
总结:function_score允许自定义打分逻辑;bool查询支持must(与)、should(或)、must_not(非)、filter(过滤条件)。
6. 布尔查询
布尔查询结合多个子条件以实现复杂搜索,支持以下逻辑关系:
- must:必须满足的条件。
- should:可选条件。
- must_not:必须不匹配的条件。
- filter:过滤条件,不参与打分。
示例:
GET /wineshop/_search
{
"query": {
"bool": {
"must": [
{"match": { "name": "如家" }}
],
"must_not": [
{"range": { "price": { "gt": 400 }}}
],
"filter": [
{"geo_distance": {
"distance": "10km",
"location": {
"lat": 31.21,
"lon": 121.5
}
}}
]
}
}
}
总结:bool查询通过逻辑关系组合条件,适合复杂搜索需求。
关注与支持:欢迎点赞、收藏和关注以获取更多内容。
springboot葵花宝典
springboot葵花宝典
扫码关注公众号
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
查看方案
springboot葵花宝典的其他文章
WebSocket快速入门
WebSocket 是基于 TCP 的一种新的**网络协议**。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建**持久性**的连接, 并进行**双向**数据传输
Webpack 入门教程
Webpack 入门教程
从瀑布到敏捷:深入持续集成与Jenkins的探索
从瀑布到敏捷:深入持续集成与Jenkins的探索
SpringBoot实现RabbitMQ的几种常用模式
今天接着介绍了SpringBoot实现RabbitMQ几种常用的模式,如fanout、headers、direct、topic模式,以及其在SpringBoot中代码实现和配置。
Redis:优雅键值设计与BigKey处理指南
Redis:优雅键值设计与BigKey处理指南
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线