Elasticsearch模糊查询精讲

2023-05-16

目录

一.3种模糊查询的区别 以及 常用的查询手段

1.wildcard

2.prefix

3.fuzzy 

4.exists query

二. terms_set(主要用于数组检索)

1.数据准备

2.minimum_should_match_field

3.minimum_should_match_script

4.terms_set与match query的比较

三.其他查询

1.regexp (使用正则表达式术语查询)

2.ids 

四.Elasticsearch Term-level queries(磁条级搜索)总结大全


学习目标:

1、wildcard、prefix、fuzzy这3种模糊查询的异同点是什么?

2、如何使用 terms_set检索Array类型的字段?

3、Term-level queries(磁条级搜索)总结大全

一.3种模糊查询的区别 以及 常用的查询手段

1.wildcard

查询包含通配符表达式字段的文档。【ps:等价于mysql 的 like 查询】

通配符 *:它匹配任何字符序列(包括空字符)

占位符 ?:它匹配任何单个字符。

说明:请注意,此查询的速度可能很慢,因为它需要迭代许多项。为了防止极慢的通配符查询,通配符术语不应以通配符*或?之一开头。

(1)通配符*

GET /blogs_index/_search
{
    "query": {
        "wildcard" : { "author": "方*" }
    }
}

上述DSL语句,可以检索到所有文档。等价于sql【where author like "方%”】

(2)占位符?

GET /blogs_index/_search
{
    "query": {
        "wildcard" : { "author": "方?" }
    }
}

上述DSL语句,检索结果为空。等价于sql【where author like "方_”】

2.prefix

查找指定字段包含以指定确切前缀开头的术语的文档。

GET /_search
{ "query": {
    "prefix" : { "author": "方" }
  }
}

该DSL等价于 wildcard query 的 "wildcard" : { "author": "方*" },等价于sql【where author like "方%”】

3.fuzzy 

模糊查询使用基于Levenshtein编辑距离的相似度。是一种误拼写时的fuzzy模糊搜索技术,用于搜索的时候可能输入的文本会出现误拼写的情况。

比如输入"方财兄",这时候也要匹配到“方才兄”

GET /blogs_index/_search
{
    "query": {
        "fuzzy" : {
            "author": {
                "value": "方财兄",
                "fuzziness": 1,
                "prefix_length": 1,
                "max_expansions": 100
            }
        }
    }
}
fuzziness:最大编辑距离【一个字符串要与另一个字符串相同必须更改的一个字符数】。默认为AUTO。
prefix_length:不会被“模糊化”的初始字符数。这有助于减少必须检查的术语数量。默认为0。
max_expansions:fuzzy查询将扩展到的最大术语数。默认为50。
transpositions:是否支持模糊转置(ab→ ba)。默认值为false。


上述DSL等价于sql【

where author like “方_兄”or author like “方财_”or author like “方_财兄”or author like “方财_兄”or author like “方财兄_”

会根据上述的4个参数穷尽所有可能组合。

注意:如果prefix_length将设置为0,并且max_expansions将设置为很高的数字,
则此查询可能会很繁琐。这可能会导致索引中的每一项都受到检查!

4.exists query

(1)查找指定字段包含任何非空值【不是null 也不是[ ]】的文档。【ps:等价于mysql 的 is null】

注意:这些值不属于空值

1、空字符串,例如""或"-" 
2、包含null和另一个值的数组,例如[null, "foo"] 
3、自定义null-value,在字段映射中定义
1、查询 title字段不为 null 的文档
GET /blogs_index/_search
{
    "query": {
        "exists" : { "field" : "title" }
    }
}

(2)查询为null的字段,应该使用:must_not + exists

2、查询 title字段为 null 的文档
GET /blogs_index/_search
{
    "query": {
        "bool": {
            "must_not": {
                "exists": {
                    "field": "title"
                }
            }
        }
    }
}

二. terms_set(主要用于数组检索)

返回的文档至少匹配一个或多个检索的术语。这些术语未进行分析,因此必须完全匹配。每个文档中必须匹配的术语数会有所不同,并由“最小匹配项”字段控制,或者由“最小匹配项”脚本中的每个文档计算。

说明:
1.terms_set query 在对Array类型的字段做检索时非常有用,特别是对于每个文档,
需要匹配的数量不一致时。如果所有文档需要匹配的数量一致,可以使用match query替代。

2.控制必须匹配术语的数量的字段必须是数字字段

1.数据准备

PUT /term_set_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "codes": {
          "type": "keyword"
        },
        "required_matches": {
          "type": "integer"
        }
      }
    }
  }
}

PUT /term_set_index/_doc/1?refresh
{
    "codes": ["系统学习", "es","关注我"],
    "required_matches": 2
}
PUT /term_set_index/_doc/2?refresh
{
    "codes": ["系统", "学习"],
    "required_matches": 1
}

2.minimum_should_match_field

GET /term_set_index/_search
{
  "query": {
    "terms_set": {
      "codes": {
        "terms": [
          "关注我",
          "学习"
        ],
        "minimum_should_match_field": "required_matches"
      }
    }
  }
}

3.minimum_should_match_script

GET /term_set_index/_search
{
  "query": {
    "terms_set": {
      "codes": {
        "terms": [
          "系统学习",
          "关注我"
        ],
        "minimum_should_match_script": {
          "source": " doc['required_matches'].value"
        }
      }
    }
  }
}

上2、3 的dsl是等价的关系,搜索结果如下:

可以检索到文档2。对于文档1,需要至少匹配2个term,但是在检索terms里,只能匹配上【关注我】一个term,所以文档1不符合检索条件;对于文档2,只需要匹配一个term,刚好能匹配上检索terms里的【学习】。

4.terms_set与match query的比较

当每个文档的required_matches值都相同时,上述两句DSL与下面的match query 语句检索效果完全一致:

GET /term_set_index/_search
{
    "query": {
        "match": {
            "codes" : {
                "query":  "系统学习 关注我",
                "analyzer": "whitespace",
                "minimum_should_match": 2
            }
        }
    }
}
分析:DSL语句使用 "analyzer": "whitespace", 
所以 query会被分词两个Token/term【系统学习】【关注我】。
"minimum_should_match": 2,所以可以检索到文档1。

三.其他查询

1.regexp (使用正则表达式术语查询)

GET /_search
{
    "query": {
        "regexp":{
            "name.first": "s.*y"
        }
    }
}

注意:regexp查询的性能在很大程度上取决于所选的正则表达式。匹配所有类似的东西.*都很慢,而且使用环视正则表达式也很慢。如果可能,应在正则表达式开始之前尝试使用长前缀。

2.ids 

根据index的_id 字段检索文档

GET /_search
{
    "query": {
        "ids" : {
            "type" : "_doc",
            "values" : ["1", "4", "100"]
        }
    }
}

四.Elasticsearch Term-level queries(磁条级搜索)总结大全

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch模糊查询精讲 的相关文章

随机推荐

  • Kolla-ansible自动化部署openstack

    Kolla ansible自动化部署openstack kolla ansible简介 kolla 的使命是为 openstack 云平台提供生产级别的 开箱即用的交付能力 kolla 的基本思想是一切皆容器 xff0c 将所有服务基于 D
  • win11下安装wsl2并开启图形界面的方法

    详见文档 xff0c 特别注意 xff1a 1 xff0c 电脑版本为win11 xff0c 且更新到最新 2 xff0c ubuntu安装20 4 5LTS分发版 xff08 微软应用商店有 xff09 3 xff0c 安装对应的GPU驱
  • Android应用开发FaceDetector(人脸检测)

    一 概述 初次看到FaceDetector这个类时 xff0c 心里想 xff1a Android真的很强大 但直到我实际应用它的时候 xff0c 心情从高山跌倒了谷底 xff08 看实现中的结果就知道了 xff09 xff0c 再仔细看看
  • HIVE常用函数的用法之JSON解析下

    HIVE常用函数之JSON TUPLE 如果JSON为空或者为非法的JSON格式 xff0c 返回NULL 如果键Key为空或者不合法 xff08 JSON中不存在 xff09 返回NULL 如果JSON合法 xff0c 键Key也存在 x
  • 时间机器无法存入备份之外的文件的解决方法

    在macOS Big Sur 11 0之后 xff0c APFS 或 APFS 加密磁盘已经替代Mac OS 扩展格式 xff08 日志式 xff09 格式 xff0c 成为时间机器备份磁盘的首选格式 但是Mac将整个APFS宗卷作为时间机
  • ROS安装与报错记录

    ubuntu18 04 安装ros melodic的踩最全的坑的记录 目录 ubuntu18 04 安装ros melodic的踩最全的坑的记录ubuntu 18 04 ros melodic安装记录 ubuntu20 04 ROS noe
  • Eigen3安装、卸载与重装(包含一键卸载安装指令)

    目录 ubuntu中一键卸载安装的 96 sh 96 文件下载链接一 卸载1 查看当前版本2 删除 96 eigen3 96 相关文件二 安装需要的版本1 官网 https gitlab com libeigen eigen release
  • c++调用python

    这里写目录标题 c 43 43 调用python头文件包含初始化python调用具体的函数调用链接CMakeLists txtExamplec 43 43 python的数据类型转化图像数据格式cv Mat传递numpy数据格式转化 一些奇
  • 在ubuntu安装使用miniconda

    目录 miniconda安装使用安装下载更好channel开启虚拟环境 使用一些库安装 miniconda安装使用 安装 下载 span class token function wget span https mirrors tuna t
  • 李群、李代数在SLAM中的应用

    文章目录 李群 李代数李群 李代书与坐标变换的对应关系SE 3 上的李代数求导数左乘扰动 右乘扰动怎么选取用左or右扰动 xff1f SLAM中的使用重投影误差误差项构建对应C 43 43 代码雅克比矩阵frame i的Ti2w从IMU坐标
  • ubuntu 系统安装与问题汇总

    文章目录 ubuntu 系统前期准备系统安装系统安装后显卡驱动问题设置win与ubuntu系统的启动顺序双系统时间问题系统显卡驱动选择意外状况 黑屏无法开机 重刷系统 ubuntu 系统 前期准备 硬盘分区设置BIOS选项 把快速启动关闭把
  • g2o中的核函数

    文章目录 g2o中的核函数RobustKernelHuber函数 g2o中的核函数 作用限制误差较大的edge对最终优化结果的影响 RobustKernelHuber函数 g2o中的class名称 xff1a class RobustKer
  • Eigen库参考博文

    记录一些看过的相关博客的介绍网站 动态大小的矩阵MatrixXd VectorXd
  • Illegal modifier for parameter *** , only final is permitted”

    大家好 xff0c 我想在main函数中定义一个public变量 xff0c 系统报错说 Illegal modifier for parameter chatRoom only final is permitted xff0c 如果把pu
  • C++基础学习

    文章目录 编译内存相关编译变量与内存分区内存分区变量类型 内存对齐内存泄露智能指针include 34 34 和 lt gt 语言对比c 43 43 11自动类型推导lembda 表达式 xff08 匿名函数 xff09 范围for del
  • C++ STL底层实现

    文章目录 STL库的底层实现arrayvectordequelistforward listset mapunordered map unordered set迭代器 STL库的底层实现 顺序容器 array数组vector向量deque双
  • kali爆破WiFi

    kali暴力破解WiFi密码实验步骤 建议在kali的root模式下进行 实验条件 xff1a window7下的VMware装的kali 2020 某宝买的无线 网卡 xff0c 注意 xff0c 有些厂家的网卡不支持Linux系统 xf
  • Nacos全面解析

    目录 一 Nacos概要 1 Nacos简介 2 Nacos安装 3 Nacos配置外部数据源 二 Nacos应用 1 注册发现 2 负载均衡 3 配置中心 4 多环境切换 5 配置刷新 6 共享 扩展配置 7 灰度发布 一 Nacos概要
  • Mysql性能调优

    目录 一 Mysql架构设计 1 Mysql架构图 二 Mysql常见的存储引擎 1 InnoDB引擎 2 MyISAM存储引擎 3 MEMORY存储引擎 三 Mysql索引 1 索引的分类 2 mysql中空值和null的区别 3 mys
  • Elasticsearch模糊查询精讲

    目录 一 3种模糊查询的区别 以及 常用的查询手段 1 wildcard 2 prefix 3 fuzzy 4 exists query 二 terms set 主要用于数组检索 1 数据准备 2 minimum should match