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

相关推荐
m0_495562783 小时前
Swift-snapKit使用
开发语言·elasticsearch·swift
蒋厚施7 小时前
elasticsearch 安装 repository-oss 插件
elasticsearch
开开心心_Every8 小时前
专业视频修复软件,简单操作效果好
学习·elasticsearch·pdf·excel·音视频·memcache·1024程序员节
Elastic 中国社区官方博客21 小时前
Elasticsearch 的结构化文档配置 - 递归分块实践
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·jenkins
神的孩子都在歌唱21 小时前
Elasticsearch 7.6 安装 Jieba 中文分词插件完整教程
elasticsearch·中文分词·jenkins
草明21 小时前
Elasticsearch 报错:index read-only / allow delete (api) 深度解析与解决方案
大数据·elasticsearch·jenkins
失散131 天前
分布式专题——55 ElasticSearch性能调优最佳实践
java·分布式·elasticsearch·架构
Elasticsearch1 天前
在 Elastic Observability 中使用 OpAmp 对 EDOT SDK 进行集中配置
elasticsearch
神的孩子都在歌唱1 天前
es开源小工具 -- 分析器功能
大数据·elasticsearch·开源
BugShare1 天前
嘿嘿,一个简单ElasticSearch小实现
java·大数据·spring boot·elasticsearch