elasticsearch查询操作(DSL语句方式)

news2025/1/10 21:20:34

说明:本文介绍在kibana,es的可视化界面上对文档的查询操作;

添加数据

先使用API,创建索引库,并且把数据从MySQL中查出来,传到ES上,参考(http://t.csdn.cn/NaTHg)

在这里插入图片描述

索引库(student)结构;

在这里插入图片描述

1、模糊查询

模糊查询,是指字段类型是“text”,参与分词的字段,如name、all字段;

(1)全部查询;

格式:

# 1.1 全部查询
GET /索引库名/_search
{
  "query": {
    "match_all": {}
  }
}

可以看到,13条文档都查询出来了;

在这里插入图片描述

(2)单字段查询;

格式:

# 1.2 单字段查询
GET /索引库名/_search
{
  "query": {
    "match": {
      "字段名": "字段值"
    }
  }
}

查询结果:

在这里插入图片描述

(3)多字段查询;

格式:

# 1.3 多字段查询
GET /索引库名/_search
{
  "query": {
    "multi_match": {
      "query": "字段值",
      "fields": ["字段名1","字段名2"]
    }
  }
}

查询结果:

在这里插入图片描述

2、精确查询

精确查询,用于等值判断的文档,即查询的值等于文档中对应字段的值,有两种,分别是term、range;

(1)term查询;

格式:

GET /索引库/_search
{
  "query": {
    "term": {
      "字段名": {
        "value": "字段值"
      }
    }
  }
}

查询结果:

在这里插入图片描述

(2)range查询;

格式:

# 2.2 精确查询之range:job>=1 and job < 3
GET /索引库名/_search
{
  "query": {
    "range": {
      "字段名": {
        "gte": 字段值≥,
        "lt": 字段值<
      }
    }
  }
}

查询结果:

在这里插入图片描述

3、地理坐标查询

es提供了地理坐标数据类型(如geo_point),如果文档中有由经纬度组成的位置数据,可以针对文档中的经纬度坐标查询,有两种方式:

(1)矩形范围;

根据提供的两个位置,画出一个矩形,查询位置在这个矩形内的文档;

在这里插入图片描述

格式:

GET /索引库名/_search
{
  "query": {
    "geo_bounding_box":{
      "location":{
        "top_left":{
          "lat":左上角位置纬度,
          "lon":左上角位置经度
        },
        "bottom_right":{
          "lat":右下角位置纬度,
          "lon":右下角位置经度
        }
      }
    }
  }
}

(2)方圆范围;

根据提供的一个位置,一个距离,以位置为圆心,距离为半径,查询该位置方圆范围的文档;

在这里插入图片描述

格式:

# 3.2 地理查询值geo_distance
GET /索引库名/_search
{
  "query": {
    "geo_distance":{
      "distance":"距离",
      "location":"纬度,经度"
    }
  }
}

距离可以可以写任意长度单位,如15km,15000m;

4、复合查询

(1)算分查询;

查询的每条文档都会有一个分值,这个分值是ES根据BM25公式计算得出的,查询结果会按照分值从高到低排序,我们可以根据文档中的条件,来手动调整该分值,使分值高的文档排在最前面;

在这里插入图片描述

比如,我们把ID为13的文档,手动修改分值,使其排在最前面;

格式:

# 4.1 算分查询
GET /student/_search
{
  "query": {
    "function_score": {
      "query": {
      	# 查询
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
          	# 过滤
            "term": {
              "id": "13"
            }
          },
          # 设置权重
          "weight": 10
        }
      ],
      # 加权模式,即最终分值 = 查询分值 ? 权重的运算符,multiply为乘
      "boost_mode": "multiply"
    }
  }
}

boost_mode常见的有multiply(乘),sum(加),replace(替换,即使用权重替换掉查询分值);

在这里插入图片描述

(2)布尔查询;

布尔查询也叫复合查询,指多条件的查询,该查询下有以下四个子查询,可根据实际需要添加:

  • must:必须匹配的子查询,类似“与”;

  • should:选择性匹配子查询,类似“或”;

  • must_not:必须不匹配,不参与算分,类似“非”;

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

如查询性别为“1”,job不在(2,4]区间内,id为11的文档,all字段可以为123456,DSL语句如下:

# 4.2 布尔查询
GET /student/_search
{
  "query": {
    "bool": {
      # 必须匹配的子查询
      "must": [
        {
          "match": {
            "gender": "1"
          }
        }
      ],
      # 必须不能匹配的子查询
      "must_not": [
        {
          "range": {
            "job": {
              "gt": 2,
              "lte": 4
            }
          }
        }
      ],
      # 可以匹配的子查询
      "should": [
        {
          "match": {
            "all": "123456"
          }
        }
      ],
      # 必须匹配的子查询
      "filter": [
        {
          "term": {
            "id": "11"
          }
        }
      ]
    }
  }
}

must、should参与算分,即分值高低决定排序前后顺序;

must_not、filter不参与算分,分值高低无所谓;

5、排序

(1)按位置排序

如果文档字段中有位置/坐标相关的字段,可将查询结果按照位置排序,距离越近排序越靠前;

表示按照提供的位置,距离该位置越近,排序越靠前,当然这取决于order是不是升序(asc);

# 5.1 按照坐标排序
GET /索引库名/_search
{
  "query": {
    "match_all": {}
  }
  , "sort": [
    {
      "_geo_distance": {
        # 文档中位置相关的字段名、字段值
        "字段名": {
          "lat": 纬度,
          "lon": 经度
        },
        # 升序
        "order": "asc",
        # 距离单位
        "unit": "km"
      }
    }
  ]
}

(2)按字段值排序

如按照job的值降序,越高排序越靠前;

格式:

# 5.2 按照字段值排序
GET /索引库名/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "字段名": {
        "order": "desc"
      }
    }
  ]
}

查询结果,job越高排序越靠前;

在这里插入图片描述

(3)按多个字段值排序

如果有多个值参与排序,可在sort里面按照顺序写多个值;

如按照job降序,job相同再按照gender升序;

格式:

# 5.3 按照多个字段值排序
GET /索引库名/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "字段值1": {
        "order": "desc"
      },
      "字段值2": {
        "order": "asc"
      }
    }
  ]
}

也可以写在外面的大括号里面,效果一样,如下:

# 5.3 按照多个字段值排序
GET /索引库名/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "字段值1": {
        "order": "desc"
      }
    },
    {
      "字段值2": {
        "order": "asc"
      }
    }
  ]
}

6、分页

es默认查询只显示前10条,可以使用分页输出,输出更多内容;目前es常用的分页有两种方式:

  • 方式一:指定起始(from)、条数分页(size);

  • 方式二:基于上一次查询(search_after)的结果,取值作为参数,设置条数,分页查询;

(1)方式一:

如查询起始ID为5,条数为5的文档内容;

# 6.1 分页:方式一
GET /student/_search
{
  "query": {
    "match_all": {}
  },
  "from": 起始位置,
  "size": 条数
}

注意from的值是从0开始计算的,所以需要 - 1;

在这里插入图片描述

(2)方式二

如方式一中,可以取出查询结果中的ID值,作为search_after的参数,往后查询4条

# 6.2 分页:方式二
GET /student/_search
{
  "query": {
    "match_all": {}
  },
  "size": 4,
  "search_after":["5"],
  "sort": [
    {
      "id": {
        "order": "asc"
      }
    }
  ]
}

查询结果:

在这里插入图片描述

小结

  • 方式一查询,需要注意 from + size不能超过10000 ,不然会报错;

(4 + 9996 = 10000 不会报错)

在这里插入图片描述

(4 + 9997 = 10001 超过10000报错)

在这里插入图片描述

方式二(search_after)分页查询,需要注意,字段尽量使用主键字段或者唯一字段,不然在设置上次查询的值时,该值如果在上次查询的结果中有多条,会选择最后一条文档作为search_after的位置,这样可能会跳过一些文档。

7、高亮

高亮是指对查询的结果,可选择字段特殊显示。如百度中查询的结果,关键字会呈红色字体显示,具体实现就是把关键词前后加一个css样式;

在这里插入图片描述

例如我这里把查询的结果,name字段斜体显示,如下:

# 7. 高亮
GET /student/_search
{
  "query": {
    "match": {
      "all":"鲁迅"
    }
  },
  "highlight": {
    "fields": {
      "name":{
      	# 关键词前
        "pre_tags": "<em>",
        # 关键词后
        "post_tags": "</em>",
        # 此字段是否为match匹配的字段,选择false,因为我上面没有按照name进行匹配查找
        "require_field_match": "false"
      }
    }
  }
}

查询结果可以看到,鲁迅前后被em标签包裹

在这里插入图片描述

总结

以上DSL语句不可直接复制使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ceph部署方法介绍

Ceph部署方法介绍 Installing Ceph — Ceph Documentation Ceph环境规划 admin是一个部署节点

Centos7 扩容(LVM 和非 LVM)

一、磁盘扩容方式 CentOS 系统的磁盘扩容可以分为两种方式&#xff1a;LVM 管理和非 LVM 管理。 LVM 管理的分区和传统分区方式是可以共存的。在同一个系统中&#xff0c;你可以同时使用 LVM 管理的分区和传统分区。 例如&#xff0c;在 CentOS 系统中&#xff0c;你可以选择将…

《重构的时机和方法》书籍推荐

《重构的时机和方法》是一本由克里斯蒂安克劳森(Christian Clausen)所著&#xff08;郭涛翻译&#xff09;的软件工程经典之作。本书全面介绍了重构的概念、原则和方法&#xff0c;为软件开发者提供了一系列宝贵的指导和实践经验。在这篇书评文章中&#xff0c;我将从内容、实用…

Linux环境安装Tomcat

在tomcat官网(下载路径)下载好tomcat压缩包 上传服务器压缩到/usr/tomcat目录下 tar -zxvf xxx.tar.gz 配置tomcat环境变量 export CATALINA_HOME/usr/tomcat/apache-tomcat-8.5.56 export CATALINE_BASE/usr/tomcat/apache-tomcat-8.5.56 export PATH$PATH:$CATALINA_BASE/bi…

阿克曼转向模型介绍

阿克曼转向模型介绍 目录 阿克曼转向模型介绍是什么&#xff1f;基本原理应用与改进 是什么&#xff1f; 阿克曼转向是一种现代汽车的转向方式&#xff0c;在汽车转弯的时候&#xff0c;内外轮转过的角度不一样&#xff0c;内侧轮胎转弯半径小于外侧轮胎。 它描述了汽车转向系…

Spring中如何用注解方式存取JavaBean?有几种注入方式?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 本篇文章将讲解如何在spring中使用注解的方式来存取Bean对象&#xff0c;spring提供了多种注入对象的方式&#xff0c;常见的注入方式包括 构造函数注入&#xff0c;Setter 方法注入和属性…

TypeError: can‘t convert np.ndarray of type numpy.object_.

在处理数据集的时候出现报错&#xff1a; TypeError: can’t convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool. train_labels torch.tensor(train…

手机怎么压缩pdf?这种压缩方法简单易用

手机怎么压缩pdf&#xff1f;PDF文件是我们生活和工作中常用的一种文档格式&#xff0c;但是有时候PDF文件的大小会很大&#xff0c;不方便发送和存储。那么&#xff0c;如何在手机上压缩PDF文件呢&#xff1f;下面就给大家介绍一种简单好用的压缩方法。 今天要给大家介绍的这款…

甘特图的发展史

目录 背景: 过程: 总结&#xff1a; 背景: 1910年代初为了管理工程项目的进度而创造了甘特图。 1917年&#xff0c;美国工程师亨利甘特(Henry Laurence Gantt)首次提出了甘特图的概念。他是一位工程师和管理学家&#xff0c;设计了一种图表&#xff0c;用于显示进度成产仅度…

毕业生求职招聘网站的设计与实现JAVA(SpringBoot+VUE+Mysql)

由SpringBootVUEMysql实现的网站的设计 功能模块 设计思路&#xff1a;主要分为管理员、毕业生、招聘企业三大身份模块 首先是登录界面 注册界面 其次就是公共页面 公共页面又分为首页、空中宣讲会、招聘岗位、求职信息、论坛信息、试卷列表、招聘资讯、个人中心和后台管理、…

【原创】内网穿透案例

案列一&#xff08;Frp内网渗透&#xff09; 大概图列网上随便找的&#xff0c;路线是这个样子 这里选用ctfshow的一道命令执行题 由Frp实现内网访问及扫描 1.传入一句话&#xff0c;上线蚁剑http://b85fdf24-b98e-4810-9e76-a038a8987630.challenge.ctf.show:8080/?cecho…

C语言--位段

C语言—位段 文章目录 C语言---位段一、位段是什么&#xff1f;二、位段的内存分配三&#xff0c;位段的跨平台问题四&#xff0c;位段的应用 一、位段是什么&#xff1f; 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或…

代码随想录day12 | [前、中、后、层]二叉树的遍历迭代法和递归法

文章目录 一、前后中序递归法二、前后序迭代法三、中序遍历迭代法四、层序遍历 递归三部曲&#xff1a; 1️⃣ 第一步确定递归函数的返回值和参数 2️⃣第二步确定递归的终止条件 3️⃣第三步确定单层递归处理的逻辑 一、前后中序递归法 前序遍历二叉树 class Solution { pr…

vue三级路由的写法

{path: "/trafficmanagement",component: Layout,redirect: "/trafficmanagement",alwaysShow: true,meta: {title: "通行模块",icon: "excel",},children: [{path: "carline",name: "carline",alwaysShow: true,…

数据结构day8(2023.7.25)

一、排序算法 排序&#xff1a;把无需序列转换为有序序列的一种算法。 内排&#xff1a;在计算机内存中实现的排序算法【多用适用于数据量较小的情况】 外排&#xff1a;在计算机内存以及外部介质实现的排序算法【先内存&#xff0c;在外部】 排序的分类&#xff1a; 交换排…

Godot 4 源码分析 - 获取脚本

获取属性列表 今天搂草打兔&#xff0c;取得了脚本内容 因为已能取得属性值&#xff0c;那就再进一步&#xff0c;取得属性名列表 if (SameText(drGet.propertyName, "propertyNames", DRGRAPH_FLAG_CASESENSITIVE)) {List<PropertyInfo> *p_list new List…

8年测试整理,自动化测试框架从0到1实施,一篇打通自动化...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 框架本身一般不完…

【LeetCode】62.不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …

信息的表示与处理 (深入理解计算机系统第二章)

刚学习这本书没多久&#xff0c;感觉里面讲的东西挺多的&#xff0c;前后的关联性比较强。学着后面的还需要看看前的才可以更好的理解。 2.1信息存储 无符号(unsigned) 编码是基于传统的二进制表示法的&#xff0c;表示大于或者等于零的数字。 二进制补码(twos-complement)编…

7.string字符串的加法

字符串的加法其实是一个拼接生成新的一个字符串&#xff0c; #include <iostream> #include <Windows.h> #include <string> using namespace std; int main(void) { string s1 "武当派"; string s2 "张三丰"; string s3 "太极…