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

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

yuyutoo 2024-10-28 20:21 1 浏览 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这两个字段匹配略有磨损



相关推荐

MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库

前言:本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例。最后就是ThinkPHP5的分布式的连接,读写...

thinkphp5多语言怎么切换(thinkphp5.1视频教程)

thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。第二步,创建多语言目录。相关推荐:《ThinkPHP教程》第三步,编写语言包。视图代码:控制器代码:效果如下:以上就是thi...

基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin

FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。主要特性基于Auth验证的权限管理系统支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置支持单...

Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示

本文实例讲述了Thinkphp5.0框架实现控制器向视图view赋值及视图view取值操作。分享给大家供大家参考,具体如下:Thinkphp5.0控制器向视图view的赋值方式一(使用fetch()方...

thinkphp5实现简单评论回复功能(php评论回复功能源码下载)

由于之前写评论回复都是使用第三方插件:畅言所以也就没什么动手,现在证号在开发一个小的项目,所以就自己动手写评论回复,没写过还真不知道评论回复功能听着简单,但仔细研究起来却无法自拔,由于用户量少,所以...

ThinkPHP框架——实现定时任务,定时更新、清理数据

大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用到一个名为E...

BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统

BeyongCms内容管理系统(简称BeyongCms)BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统,适用于企业Cms,个人站长等,针对移动App、小程序优化;提供完善简...

YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发

介绍YimaoAdminv3.0.0企业建站系统,使用thinkphp5.1.27+mysql开发。php要求5.6以上版本,推荐使用5.6,7.0,7.1,扩展(curl,...

ThinkAdmin-V5开发笔记(thinkpad做开发)

前言为了快速开发一款小程序管理后台,在众多的php开源后台中,最终选择了基于thinkphp5的,轻量级的thinkadmin系统,进行二次开发。该系统支持php7。文档地址ThinkAdmin-V5...

thinkphp5.0.9预处理导致的sql注入复现与详细分析

复现先搭建thinkphp5.0.9环境...

thinkphp5出现500错误怎么办(thinkphp页面错误)

thinkphp5出现500错误,如下图所示:相关推荐:《ThinkPHP教程》require():open_basedirrestrictionineffect.File(/home/ww...

Thinkphp5.0极速搭建restful风格接口层

下面是基于ThinkPHPV5.0RC4框架,以restful风格完成的新闻查询(get)、新闻增加(post)、新闻修改(put)、新闻删除(delete)等server接口层。1、下载Thin...

基于ThinkPHP5.1.34 LTS开发的快速开发框架DolphinPHP

DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机...

ThinkPHP5.*远程代码执行高危漏洞手工与升级修复解决方法

漏洞描述由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。漏洞评级严重影响版本ThinkPHP5.0系列...

Thinkphp5代码执行学习(thinkphp 教程)

Thinkphp5代码执行学习缓存类RCE版本5.0.0<=ThinkPHP5<=5.0.10Tp框架搭建环境搭建测试payload...

取消回复欢迎 发表评论: