百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Elasticsearch 查询语句Query DSL语句之单个条件查询

yuyutoo 2024-10-28 20:21 3 浏览 0 评论

Elasticsearch的查询语句Query DSL是掌握搜索技能的基石,下图来概括一下单个条件查询语句的主要使用:

一.精准查询

1.exists

  • 功能: 判断某个字段是否在文档中存在
  • 用法:
    • 参数: field -> 指定要判断的字段名称
  • 实例:
PUT test_steam_item_730 
{
  "aliases": {
    "steam_item": {}
  },
  "mappings": {
    "dynamic":false,
    "properties": {
      "id":{
        "type":"long"
      },
      "app_id":{
        "type":"integer"
      },
      "image_url":{
        "type":"keyword",
        "index":false
      },
      "name":{
        "type":"text"
      },
      "min_price":{
        "type":"double"
      },
      "attribute":{
        "properties": {
          "type":{
            "type":"keyword"
          },
          "rarity":{
            "type":"keyword"
          }
        }
      },
      "extra_tag_ids":{
        "type":"keyword"
      }
    }
  },
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  }
}

插入一些值

POST _bulk
{"index":{"_index":"test_steam_item_730","_id":1}}
{"id":1,"name":"第一个饰品","image_url":"test1.png","extra_tag_ids":[],"attribute":{"type":"csgo_type_knife","rarity":"normal"}}
{"index":{"_index":"test_steam_item_730","_id":2}}
{"id":2,"name":"","extra_tag_ids":[null],"attribute":{"type":"csgo_type_knife"},"min_price":0}

使用exists来判断某个字段值是否存在

GET test_steam_item_730/_doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "extra_tag_ids"
          }
        }
      ]
    }
  }
}
  • 笔者有话说:
    • 以下情况会认为字段是不存在的
      • 字段值为null,数组类型字段值为[]
      • 字段指定了index=false的和doc_values=false的字段
      • 字段的值的长度超过了指定的ignore_above的长度
    • 以下情况认为字段是存在的
      • 空字符串,即""
      • 数据有非null的元素值
      • 自定义的null值,在mapping中定义的null_value,如"NULL"

2.ids

  • 功能: 通过文档ID批量查询(文档ID即文档的_id)
  • 用法:
    • 参数: values -> 文档ID列表
  • 实例:
GET test_steam_item_730/_doc/_search
{
  "query":{
    "ids":{
      "values":[1,2]
    }
  }
}

3.range

  • 功能:根据大小范围查找(类似于关系型数据库中的between and)
  • 参数:
    • gt: 大于指定值
    • gte: 大于等于指定值
    • lt: 小于指定值
    • lte: 小于等于指定值
    • format: 格式(一般是Date类型的格式化模式)
    • boost: 指定权重
  • 实例:
GET test_steam_item_730/_doc/_search
{
  "query":{
    "range":{
      "min_price":{
        "gte":0.1,
        "lte":150
      }
    }
  }
}

查询min_price字段值在[0.1,150]这个范围的数据

4.term

  • 功能: 查询等于某个值的文档
  • 参数:
    • 字段名 : 条件值
  • 实例:
GET test_steam_item_730/_doc/_search
{
  "query":{
    "term":{
      "app_id":730
    }
  }
}

查询 app_id = 730 的数据

5.terms

  • 功能: 查询字段在某个值列表范围内
  • 参数:
    • 字段名 : [字段值列表]
  • 实例:
POST test_steam_item_730/_bulk
{"update":{"_index":"test_steam_item_730","_id":1}}
{"doc":{"extra_tag_ids":["热门","热销","推荐"]}}
{"update":{"_index":"test_steam_item_730","_id":2}}
{"doc":{"extra_tag_ids":["热门","刀具"]}}

查询:

GET test_steam_item_730/_doc/_search
{
  "query":{
    "terms":{
      "extra_tag_ids":["热门","热销"]
    }
  }
}

这个查询语句会查出包含热门或热销这两个标签中任意一个标签的文档

  • 如果想查出包含这两个标签的文档呢?
GET test_steam_item_730/_doc/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "extra_tag_ids": "热门"
          }
        },
        {
          "term": {
            "extra_tag_ids": "热销"
          }
        }
      ]
    }
  }
}

将它们当作并列条件即可

6.terms_set

  • 功能:和terms功能类似,但
  • 参数:
    • terms: 查询条件
    • minimum_should_match_field: 最小匹配的字段名称(该字段值必须是个数字类型)
  • 实例:

新增字段:

PUT test_steam_item_730/_mappings
{
  "properties":{
    "min_tag_count":{
      "type":"integer"
    }
  }
}

批量给最新字段添加值

POST test_steam_item_730/_bulk
{"update":{"_index":"test_steam_item_730","_id":1}}
{"doc":{"extra_tag_ids":["热门","热销","推荐"],"min_tag_count":2}}
{"update":{"_index":"test_steam_item_730","_id":2}}
{"doc":{"extra_tag_ids":["热门","刀具"],"min_tag_count":2}}

查询:

GET test_steam_item_730/_doc/_search
{
  "query": {
    "terms_set": {
      "extra_tag_ids": {
        "terms": [
          "热门",
          "热销"
        ],
        "minimum_should_match_field": "min_tag_count"
      }
    }
  }
}

查询出包含 热门 和 热销 这两个标签,而且min_tag_count要和查询的标签数量一致(即为2)

二.模糊匹配

1.fuzzy

  • 功能: 相似值匹配
  • 参数:
    • value: 要查询的值
    • max_expansions: 最大匹配长度
    • fuzziness :最大编辑距离(是指两个字串之间,由一个转成另一个所需的最少编辑操作次数),默认为 AUTO
    • prefix_length: 最大前缀匹配长度
    • transpositions : 是否支持模糊转置( ik -> ki )
  • 实例:
GET test_steam_item_730/_doc/_search
{
  "query":{
    "fuzzy":{
      "name":{
        "value":"龙王"
      }
    }
  }
}


2.prefix

  • 功能: 前缀匹配
  • 参数:
    • value: 目标值
    • rewrite: 是否允许重写查询
    • case_insensitive: 是否不区分大小写
  • 实例:
GET test_steam_item_730/_doc/_search
{
  "query":{
    "prefix":{
      "name":{
        "value":"久经沙场"
      }
    }
  }
}

只要包含这个查询的值就可以

3.wildcard

  • 功能: 通配符匹配
  • 参数:
    • value: 匹配的表达式值(含通配符)
      • ? : 匹配单个
      • * : 匹配0个、1个或多个
    • case_insensitive: 是否不区分大小写
  • 注意:尽量不要在以*或?作为匹配表达式的开头(影响性能)
  • 实例:
GET test_steam_item_730/_doc/_search
{
  "query":{
    "wildcard":{
      "name":{
        "value":"久经**"
      }
    }
  }
}

4.regexp

  • 功能: 正则表达式匹配(与wildcard差不多,不过功能更强大)
  • 参数:
    • value: 正则表达式
    • case_insensitive: 是否不区分大小写
  • 注: 实际工具中很少使用(因为性能比较低)

5.全文检索

(1)match

  • 功能:匹配查询的词组(会对查询的目标内容进行分词)
  • 参数:
    • query: 查询的目标内容
    • analyzer: 指定分词器
    • operator:操作符
      • OR : 满足其中一个词即可
      • AND : 满足所有的词才算匹配成功
    • minimum_should_match: 最小匹配数量
  • 实例:
GET test_steam_item_730/_doc/_search
{
  "query":{
    "match":{
      "name":{
        "query":"久经沙场"
      }
    }
  }
}

(2)match_phrase

  • 功能:短语匹配(必须包含整个短语才会匹配成功,把查询的内容当作一个整体,只有完全包含这个内容才算匹配成功)
  • 参数:
    • query: 查询的目标内容
    • analyzer: 指定分词器
GET test_steam_item_730/_doc/_search
{
  "query":{
    "match_phrase":{
      "name":{
        "query":"略有磨损"
      }
    }
  }
}

必须包括 "略有磨损" 这个词才算匹配

(3)match_phrase_prefix

  • 功能:短语前缀匹配
  • 参数:
    • query: 查询的目标内容
    • analyzer: 指定分词器
GET test_steam_item_730/_doc/_search
{
  "query":{
    "match_phrase_prefix":{
      "name":{
        "query":"略有磨损"
      }
    }
  }
}

个人理解和match_phrase 区别不大

(5)multi_match

  • 功能: 多字段匹配
  • 参数:
    • query: 查询的内容
    • fields: 匹配的字段列表
GET test_steam_item_730/_doc/_search
{
  "query":{
    "multi_match":{
      "query":"略有磨损",
      "fields":["name","short_name"]
    }
  }
}

name和short_name这两个字段匹配略有磨损



相关推荐

Java开发中如何优雅地避免OOM(OutOfMemoryError)

Java开发中如何优雅地避免OOM(OutOfMemoryError)在这个信息化高速发展的时代,内存就像程序员手中的笔,缺了它就什么都写不出来。而OOM(OutOfMemoryError)就像是横在...

常见的JVM调优方法和步骤

1、内存调优堆内存设置:通过-Xms和-Xmx参数调整初始和最大堆内存大小-Xms:初始堆大小(如-Xms512M)-Xmx:最大堆大小(如-Xmx2048M)调整新生代和老年代的比例...

Java中9种常见的CMS GC问题分析与解决(一)

目前,互联网上Java的...

JDK21新特性:Prepare to Disallow the Dynamic Loading of Agents

PreparetoDisallowtheDynamicLoadingofAgentsJEP451:准备禁止动态加载代理摘要...

Java程序GC垃圾回收机制优化指南

Java程序GC垃圾回收机制优化指南作为一个Java开发者,我们经常会在任务管理器里看到Java进程占用内存不断增长,然后突然下降的现象。这其实就是在Java虚拟机中运行的垃圾回收(GC)机制在起作用...

Java Java命令学习系列(一)——Jps

jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。jps相当于Solaris进程工具ps。不象”pgrepjava”或”ps-efgrepjava”,jps...

面试题专题:头条一面参考答案(003)

前两篇文章也都是介绍头条一面的内容及参考答案...

Java JVM原理与性能调优:从基础到高级应用

一、JVM基础架构与内存模型1.1JVM整体架构概览Java虚拟机(JVM)是Java程序运行的基石,它由以下几个核心子系统组成:...

死锁攻防战:阿里架构师教你用3种核武器杜绝程序僵死

从线程转储分析到银行家算法,彻底掌握大厂必考的死锁解决方案以下是为Java死锁问题设计的结构化技术解析方案,包含代码级解决方案与高频追问应对策略:...

Java 1.8 虚拟机内存分布详解

Java1.8虚拟机内存分布详解Java1.8的JVM内存布局相比早期版本有显著变化(如永久代被元空间取代)。以下是其核心内存区域的划分、作用及配置参数:一、JVM内存整体结构...

Java 多线程开发难题?这篇文章给你答案!

作为互联网大厂的后端开发人员,在Java多线程开发过程中,必然会面临诸多复杂且具有挑战性的问题。在高并发场景下,各类潜在问题对系统的稳定性与性能产生严重影响,本文将深入探讨这些问题,并提供全面且有...

软件性能调优全攻略:从瓶颈定位到工具应用

性能调优是软件测试中的重要环节,旨在提高系统的响应时间、吞吐量、并发能力、资源利用率,并降低系统崩溃或卡顿的风险。通常,性能调优涉及发现性能瓶颈、分析问题根因、优化代码和系统配置等步骤,调优之前需要先...

JVM性能优化实战技巧

JVM性能优化实战技巧在现代企业级应用开发中,JavaVirtualMachine(JVM)作为承载Java应用程序的核心引擎,其性能直接决定了系统的响应速度、吞吐量以及资源利用率。因此,掌握一些...

JVM 深度解析:运行时数据区域、分代回收与垃圾回收机制全攻略

共同学习,有错欢迎指出。JVM运行时数据区域1.程序计数器程序计数器是一块较小的内存空间,可看作当前线程所执行的字节码的行号指示器。在虚拟机概念模型里,字节码解释器通过改变这个计数器的值选取下一条...

JVM内存管理详解与调优实战

JVM内存管理详解与调优实战Java虚拟机(JVM)作为Java程序运行的核心组件,其内存管理机制直接影响着应用程序的性能表现。今天,咱们就来一场既严肃又有趣的JVM内存管理之旅,看看这个“幕后英雄”...

取消回复欢迎 发表评论: