elasticsearch8-坐标查询和复合查询


个人名片:

博主:酒徒ᝰ.
个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志:三人行,必有我师焉。

本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

目录

  • 一、DSL查询文档
    • [4. 地理坐标查询](#4. 地理坐标查询)
    • [5. 复合查询](#5. 复合查询)
      • [1. 算分函数查询](#1. 算分函数查询)
      • [2. 布尔查询](#2. 布尔查询)

一、DSL查询文档

4. 地理坐标查询

所谓的地理坐标查询,其实就是根据经纬度查询。

常见的使用场景包括:

携程:搜索我附近的酒店

滴滴:搜索我附近的出租车

微信:搜索我附近的人

矩形范围查询

矩形范围查询,也就是geo_bounding_box查询,查询坐标落在某个矩形范围的所有文档:

语法如下:

json 复制代码
// geo_bounding_box查询
GET /indexName/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {
        "top_left": { // 左上点
          "lat": 31.1,
          "lon": 121.5
        },
        "bottom_right": { // 右下点
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}

示例:

附近查询

附近查询,也叫做距离查询(geo_distance):查询到指定中心点小于某个距离值的所有文档。

语法说明:

json 复制代码
// geo_distance 查询
GET /indexName/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km", // 半径
      "FIELD": "31.21,121.5" // 圆心
    }
  }
}

示例:

5. 复合查询

复合查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑。常见的有两种:

  • fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名
  • bool query:布尔查询,利用逻辑关系组合多个其它的查询,实现复杂搜索

相关性算分

当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。

相关性打分算法

TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大

BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平

1. 算分函数查询

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

案例:给"如家"这个品牌的酒店排名靠前一些

json 复制代码
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {  .... }, // 原始查询,可以是任意条件
      "functions": [ // 算分函数
        {
          "filter": { // 满足的条件,品牌必须是如家
            "term": {
              "brand": "如家"
            }
          },
          "weight": 2 // 算分权重为2
        }
      ],
      "boost_mode": "sum" // 加权模式,求和
    }
  }
}

示例:

小结

function score query定义的三要素是什么?

过滤条件:哪些文档要加分

算分函数:如何计算function score

加权方式:function score 与 query score如何运算

2. 布尔查询

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

子查询的组合方式有:

must:必须匹配每个子查询,类似"与"

should:选择性匹配子查询,类似"或"

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

filter:必须匹配,不参与算分

基本语法:

json 复制代码
GET /indexName/_search
{
  "query": {
    "bool": {
      "must": [
        {}
      ],
      "should": [
        {}
      ],
      "must_not": [
        {}
      ],
      "filter": [
        {}
      ]
    }
  }
}

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

相关推荐
Han.miracle1 小时前
Elasticsearch深度分页问题完整解析
大数据·elasticsearch·搜索引擎
深海鱼肝油ya1 小时前
向量数据库Elasticsearch(一)
人工智能·elasticsearch·向量数据库·es数据库增加索引·es数据库相似度查询·knn查询
大模型丫丫2 小时前
工业级 RAG 为什么需要 Elasticsearch?
elasticsearch·django·jenkins
Sayai9 小时前
Elasticsearch 9 安装验证实战:start-local 一键部署 + Docker 手动安装踩坑指南
大数据·elasticsearch·docker
瑞码空间18 小时前
git知识点黄金笔记
笔记·git·elasticsearch
切糕师学AI21 小时前
如何查看已合并到 master 分支的所有分支?Git 分支清理指南
大数据·git·elasticsearch
suaizai_1 天前
从1210条报错到全自动修复:AI闭环运维实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
不再有分配延迟:在无状态 Elasticsearch 中将快照与分片迁移解耦
大数据·运维·人工智能·elasticsearch·搜索引擎·全文检索
玫瑰互动GEO1 天前
工程视角看GEO优化与SEO优化:爬虫排序 vs 大模型引用
人工智能·爬虫·搜索引擎
百万运营Pro1 天前
用 Astro + Supabase 从零构建全网盘聚合搜索引擎:PGroonga 中文检索实战
搜索引擎·前端框架·node.js·个人开发·学习方法·ai编程·资源分享