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范围内的酒店。

相关推荐
XMYX-02 小时前
Python 操作 Elasticsearch 全指南:从连接到数据查询与处理
python·elasticsearch·jenkins
落落落sss3 小时前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
河岸飞流4 小时前
Centos安装Elasticsearch教程
elasticsearch·centos
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ6 小时前
Elasticsearch的查询语法——DSL 查询
大数据·elasticsearch·jenkins
A陈雷6 小时前
springboot整合elasticsearch,并使用docker desktop运行elasticsearch镜像容器遇到的问题。
spring boot·elasticsearch·docker
Make_magic6 小时前
Git学习教程(更新中)
大数据·人工智能·git·elasticsearch·计算机视觉
Elastic 中国社区官方博客7 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
光算科技15 小时前
如何用WordPress和Shopify提升SEO表现?
搜索引擎
SafePloy安策16 小时前
ES信息防泄漏:策略与实践
大数据·elasticsearch·开源
涔溪16 小时前
Ecmascript(ES)标准
前端·elasticsearch·ecmascript