Elasticsearch 基本使用(五)查询条件匹配方式(query query_string)

查询条件匹配方式

    • 概述
    • query
      • term
      • terms
      • range
      • match_all
      • match
        • match 匹配精度问题
      • match_phrase
      • match_pharse_prefix
      • match_bool_prefix
      • multi_match
    • query_string
      • 简单查询一个字段
      • 在多个字段上应用同一个条件 (类似multi_match)
      • 在所有字段上应用同一个条件 (超越了multi_match)
      • 对单个条件应用多个值
        • 多个值之间可以是 AND 或者 OR 的关系
      • query_string
        • match 匹配
          • 一个字段一个值
          • 一个字段多个值
          • 多个字段一个值
          • 多个字段多个值
        • 模糊匹配(比match更强大,在match后的词里面再进行模糊匹配)
        • 范围匹配
        • query_string 不同维度之间都是可以混用的(以上只是介绍了query_string基本用法,还有很多高级特性,具体可以参考官方文档)

概述

ES中常用的查询类型往大了分可以分为简单查询,复合查询,聚合查询等;
而复合查询及聚合查询都是基于简单查询的;简单查询里面对条件的匹配方式又分为不同类型。term[s],match,match_all,match_phrase 等等

query

term

单词查询,在字段的倒排索引(发生分词)或者直接在字段值(未发生分词)中查找条件值,只要找到这个条件值就算匹配上,得分为1。

terms

多个单词查询,效果为 多个 term 或者的逻辑。bool -> should -> term1,term2…

range

一般用于对数值类型进行范围查询

match_all

无条件查询,匹配所有数据

match

  • 根据文档中实际存储的字段类型(是否为分词文本 text,keyword 不会进行分词),决定是否对条件值进行分词
  • 如果未分词,直接以条件值执行 term 查询
  • 如果分词,则对条件值进行,分词处理;
    • 若得到一个词,也是执行term查询
    • 若得到多个词,默认执行 terms 查询(多个单词 或者关系)
    • 也可以手动指定为 且关系(如果为且,意思是,倒排索引后的词表中要包含 条件分词后的 所有单词),通过以下方式指定 match 单词之间的关系
    GET /stu/_search
    {"query": {"match": {"name": {"query": "张 四","operator": "and"}}}
    }
    
    以上查询 operator 默认为 or,分词 得到 两个词;
    可以查到 张三 李四 张三四 三个人。
    我们将 operator 指定为 and 后,只能查到 张三四 一个人了,必须包含条件分词后的所有单词。

match 匹配精度问题

对于match 分词后的查询;
and 是必须包含条件分词后所有的单词
or 是只需包含条件分词后任意一个单词。

and 下相对来说精度问题还好点,毕竟要包含所有条件分词单词。
如果是在or的情况,我们想要定义至少包含几个单词才当作匹配上,此时还需要另一个参数 minimum_should_match
虽然在and情况下,用得相对较少,但对and也有效
此值也可以设置为百分比,意思是条件分词后,达到比例的条件单词匹配上才算匹配
比如,以下查询语句是查不出数据的

GET /stu/_search
{"query": {"match": {"name": {"query": "张 四","operator": "and","minimum_should_match": 3}}}
}

因为你的条件分词,只有 2个词,即使分词也只得到2个词, 小于 minimum_should_match

match_phrase

以当前条件值,到文档**字段(而非分词后的列表)**里查询。
条件不做分词,到文档字段内 进行连续的 文本匹配

match_pharse_prefix

同样是以 条件不做分词到文档字段中查询,但是条件最后的 单词不是必须匹配字段内的完整单词
例如:
文档字段为 i love you
条件为 i love yo
match_phrase 下 无法匹配,因为 文档中 you 是一个完整的单词;只能匹配 i 或者 i love 或者 i love you
match_pharse_prefix 就可以匹配,就是说只要是一个前缀包含的连续文本就能匹配

match_bool_prefix

条件进行分词,执行 bool > should 查询
前面的词 做 term 查询,最后一个词做 perfix 查询

multi_match

在实际开发中,特别是模糊查询场景,可能需要将条件应用到多个文档字段上进行匹配。
当然我们可以使用 bool + should 的方式实现。
但ES已经给我们提供了一种更为便捷的方式。
同时匹配 品牌或名称 有苹果的数据

"query": {"multi_match" : {"query":    "苹果","fields": [ "brand", "name" ] }}

等价于

"query": {"bool": {"should": [{"match": {"brand": "苹果"}},{"match": {"name": "苹果"}}]}}

query_string

以下是引用自ES社区博客中的一段描述

该查询使用语法基于 ORANDNOT 等运算符来解析和拆分提供的查询字符串。 然后查询在返回匹配文档之前独立分析每个拆分文本。
你可以使用 query_string 查询创建一个复杂的搜索,其中包括通配符跨多个字段的搜索等等。 尽管用途广泛,但查询是严格的,如果查询字符串包含任何无效语法,则返回错误。

简单总结:这是使用字符串通过 AND OR NOT 构建复杂查询的一种实现方式,但是语法较严格,容易出错,并不推荐在日常查询中使用

实际测试下来,单个条件执行的应该是match操作

简单查询一个字段

default_field:条件字段,只能一个。

GET /bank/_search
{"query": {"query_string": {"default_field": "address","query": "School Lane"}}
}

返回结果为 School Lane 的match查询,凡是 address 包含 School 或者 Lane 的都匹配上
在这里插入图片描述

在多个字段上应用同一个条件 (类似multi_match)

上面的简单查询 通过 “default_field”: “字段名” 指定一个查询字段。
当要将条件应用到多个字段时,可以使用 “fields”: [“字段1”, “字段2”],

GET /bank/_search
{"query": {"query_string": {"fields": ["age", "account_number"], "query": "26"}}
}

查询 age match 26 或者 account_number match 26 的数据

在所有字段上应用同一个条件 (超越了multi_match)

在所有字段上执行match操作,只要任何一个字段匹配上就算匹配。
我们只需要去掉 fields 字段即可

GET /bank/_search
{"query": {"query_string": {"query": "28"}},"size": 2000
}

以上,在所有字段上应用 match 28。
在 bank 这个索引下,查到了 age = 28 和 id = 28 的数据

对单个条件应用多个值

多个值之间可以是 AND 或者 OR 的关系

  • 在所有字段上match 28 或者 30
GET /bank/_search
{"query": {"query_string": {"query": "28 OR 30"}},"size": 2000
}

指定字段 fields 或默认字段 default_field都适用这个逻辑关系
NOT 关键字可以用在逻辑关系中任一项的前面,表示查询相反条件

query_string

上面指定字段要么使用 fields ,要么使用 default_field,其实还有另一种更为灵活的方式,我们可以直接将字段写到 query查询语句中,
使用 query:“字段名: 条件值” 的方式灵活定制查询条件

match 匹配

一个字段一个值
GET /bank/_search
{"query": {"query_string": {"query": "age: 30"}},"size": 100
}
一个字段多个值
GET /bank/_search
{"query": {"query_string": {"query": "age: 30 OR 20"}},"size": 100
}
多个字段一个值
GET /bank/_search
{"query": {"query_string": {"query": "age: 30 OR account_number:1"}},"size": 100
}
多个字段多个值
GET /bank/_search
{"query": {"query_string": {"query": "age: (30 OR 20) OR account_number: 1"}},"size": 100
}

模糊匹配(比match更强大,在match后的词里面再进行模糊匹配)

如下:
match Sedgwick

GET /bank/_search
{"query": {"match": {"address": "Sedgwick"}}
}

match 只能在分词后的倒排索引中精确匹配
在这里插入图片描述
如果把条件值改成 Sedgwic,去掉最后一个 k,match就查不出来数据了。

但是使用 query_string 的模糊匹配依然有办法查出来这两条数据
query_string 的模糊匹配有两个通配符

  • ?,统配一个字符,
  • *,统配任意多个字符
    使用以下语句都可以查出这两条数据
  • ?匹配一个字符 k
GET /bank/_search
{"query": {"query_string": {"default_field": "address","query": "Sedgwic?"}}
}
  • *匹配一个字符 k
GET /bank/_search
{"query": {"query_string": {"default_field": "address","query": "Sedgwic*"}}
}
  • *匹配多个字符 ck
GET /bank/_search
{"query": {"query_string": {"default_field": "address","query": "Sedgwi*"}}
}
  • 前缀也能模糊
GET /bank/_search
{"query": {"query_string": {"default_field": "address","query": "*dgwi*"}}
}

以上都能查出来那两条数据。

范围匹配

默认的匹配方式为 match,其本质就是 等值匹配,只是分不分词的区别,
对于 query 中的 range 查询,query_string 中也有对应实现。
并且 query_string 还支持两种写法

  • 区间写法
    [ 表示包含起始值
    ] 表示包含结束值
    { 不包含起始值
    } 不包含结束值
    *表示不限制这一边的值
    以下例子
    • [1 TO 2] :1 <= x <= 2
    • {1 TO 2} :1 < x < 2
    • [* TO 2] : x <= 2
      依然支持上面不同字段的写法,这里只是举个例子
GET /bank/_search
{"query": {"query_string": {"default_field": "age","query": "{* TO 20]"}}
}
GET /bank/_search
{"query": {"query_string": {"query": "age:{* TO 20]"}}
}
  • 传统 > < 写法
    • “>2” 大于2
    • ">=2"大于等于2
    • “>=2 AND <=5” 大于等于2且小于等于5
      与上面那些多条件,多个值,模糊查询 不同维度之间 是可以混合使用的。
GET /bank/_search
{"query": {"query_string": {"default_field": "age","query": ">=20"}}
}

GET /bank/_search
{"query": {"query_string": {"default_field": "age","query": ">=20 AND <30"}}
}

GET /bank/_search
{"query": {"query_string": {"query": "age:(>=20 AND <30)"}}
}

query_string 不同维度之间都是可以混用的(以上只是介绍了query_string基本用法,还有很多高级特性,具体可以参考官方文档)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html掉落本地图片效果

实现一个加载本地图片并掉落的html页面。 说明 将DuanWu.html与zongzi_1.png, zongzi_2.png, zongzi_3.png, yadan.png4张图片放在同一个目录下&#xff0c;然后双击打开DuanWu.html即可。 使用Chrome或Microsoft Edge浏览器打开 若使用IE浏览器打开&#xff0c;下方会出现In…

什么是敏捷测试?

目录 前言&#xff1a; 敏捷测试的定义 敏捷测试的特点 为什么要敏捷测试 缩短价值交付周期 强调质量属于大家 化繁为简节省成本 敏捷测试VS. 传统测试 传统测试如何迁移到敏捷测试 1. 组织文化的转变 2. 组织架构的调整 3. 人员培训与指导 4. 轻流程 敏捷测试成…

一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

2013 年&#xff0c;JDN Dionisio 曾发表了一篇名为《3D Virtual Worlds and the Metaverse: Current Status and Future Possibilities》的论文&#xff0c;深入探讨与归纳了虚拟世界的几个发展阶段&#xff0c;可以简单的归纳为&#xff1a; 第一阶段&#xff1a;基于计算机…

Blender基础入门(2):Blender简单渲染

文章目录 我个人的Blender专栏前言渲染基本常识科普Blender渲染设置Blender窗口分栏分屏渲染 渲染设置GPU渲染引擎推荐最大采样 切换摄像机渲染图片渲染采样512和4096差异512采样4096采样 渲染建议 我个人的Blender专栏 Blender简单教学 前言 渲染是从白模到成品的过程&…

CEC2018动态多目标优化算法:基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2018

一、动态多目标优化问题 1.1问题定义 1.2 动态支配关系定义 二、 基于自适应启动策略的混合交叉动态多目标优化算法 基于自适应启动策略的混合交叉动态多目标优化算法&#xff08;Mixture Crossover Dynamic Constrained Multi-objective Evolutionary Algorithm Based on Se…

药物 3D 打印新突破:圣地亚哥大学用机器学习筛选喷墨打印生物墨水,准确率高达 97.22%

内容一览&#xff1a;药物喷墨打印是一种高度灵活和智能化的制药方式。据相关报告统计&#xff0c;该领域市场规模将在不久的未来呈现指数级增长。过往&#xff0c;筛选合适生物墨水的方法费时且费力&#xff0c;因此也成为药物喷墨打印领域面临的主要挑战之一。为解决这一问题…

禅意工作-诗意生活

“禅意工作&#xff0c;诗意生活”能做到这两点&#xff0c;非常非常非常难。 AI的解释&#xff1a; “禅意工作&#xff0c;诗意生活”是一种追求内心平和与幸福的生活方式&#xff0c;它将工作与生活相结合&#xff0c;达到一种和谐的状态。以下是一些关于如何实现“禅意工…

雅思词汇怎样在短期内进行突破?

雅思的考试对词汇量的要求是比较高的&#xff0c;那么该怎样才能高效的积累呢&#xff1f;和小编一起来看看雅思词汇怎样在短期内进行突破&#xff1f; 词汇突破 1&#xff09;制定合理的计划&#xff0c;反复循环 背单词是一个非常繁重的任务&#xff0c;它需要大量的精力。…

协同过滤 springboot+vue基于java的个性化图书推荐系统_1k4p4

在飞速发展的信息时代&#xff0c;随着网络学习的的普及&#xff0c;大量的学习平台和大量的图书数量迅速膨胀&#xff0c;使得学生在进行网络学习时面临“数据爆炸”和“数据过载”的情况&#xff0c;无法寻找到适合自己的图书。在面对着越来越多的图书资源&#xff0c;如何快…

AI很渴:chatGPT交流一次=喝掉一瓶水,GPT3训练=填满核反应堆

流行的大型语言模型&#xff08;LLM&#xff09;&#xff0c;如OpenAI的ChatGPT和Google的Bard&#xff0c;耗能巨大&#xff0c;需要庞大的服务器农场提供足够的数据来训练这些强大的程序。对这些数据中心进行冷却也使得AI聊天机器人对水的需求量极大。新的研究表明&#xff0…

五种网络 I/O 模型

文章目录 1. 阻塞式 I/O 模型2. 非阻塞式 I/O 模型3. I/O 多路复用4. 信号驱动式 I/O5. 异步 I/O6. I/O 模型的分类 Unix 下有五种可用的 I/O 模型&#xff1a; 阻塞式 I/O 非阻塞式 I/O I/O 多路复用&#xff08;select/poll/epoll&#xff09; 信号驱动式 I/O&#xff08;…

MongoDB远程复制集集群((两台服务器,8个实例))

第三阶段基础 时 间&#xff1a;2023年7月4日 参加人&#xff1a;全班人员 内 容&#xff1a; MongoDB远程复制集集群 目录 MongoDB远程复制集集群 实验环境&#xff1a;&#xff08;两台服务器&#xff0c;8个实例&#xff09; 环境部署&#xff1a; 安装部署 实 …