热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

es模糊查询_ES系列11:Termlevelqueries之3种模糊查询和terms_setquery

【系统学es系列】请移步公众号!带着问题学习才高效1、wildcardquery、prefixquery、fuzzyquery这3种模糊查询的异同点是什么࿱

【系统学es系列】请移步公众号!

带着问题学习才高效

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

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

ps:文末有关于Term-level queries所有查询的总结!

3ceb69e9be265a2301f2edb6cb873f43.png

01 wildcard query

检索包含通配符表达式(未分析)字段的文档。【ps:等价于mysql 的 like 查询

通配符 *:它匹配任何字符序列(包括空字符) 占位符 ?:它匹配任何单个字符

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

wildcard query是很好理解的,简单看两个示例,学会DSL语句的编写即可。

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 "方_”】

02 prefix query

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

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

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

03 fuzzy query

模糊查询使用基于Levenshtein编辑距离的相似度。是一种误拼写时的fuzzy模糊搜索技术,用于搜索的时候可能输入的文本会出现误拼写的情况。比如输入"方财兄",这时候也要匹配到“方才兄”

通过简单示例,理解 fuzzy query:

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将设置为很高的数字,则此查询可能会很繁琐。这可能会导致索引中的每一项都受到检查!

04 exists query

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

注意:这些值不属于空值

1、空字符串,例如""或"-" 2、包含null和另一个值的数组,例如[null, "foo"] 3、自定义null-value,在字段映射中定义

简单看个示例,学会DSL语句的编写即可:

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

2)查询为null的字段,应该使用:must_not + exists【ps:关于bool语句,TeHero在明天将为大家分享】

GET /blogs_index/_search
{"query": {"bool": {"must_not": {"exists": {"field": "title"}}}}
}

05 terms_set query

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

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

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
}

ps:控制必须匹配术语的数量的字段必须是数字字段

2) minimum_should_match_field

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

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

3) minimum_should_match_script

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

等价于上一句DSL。

4) 与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。ps:关于Term-level queries 与 Full Text queries 的对比分析,使用场景对比,后续TeHero将详细为大家讲解!敬请期待哟!

07 仅用于了解的term-level queries

1) regexp query——使用正则表达式术语查询

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

注意:regexp查询的性能在很大程度上取决于所选的正则表达式。匹配所有类似的东西.*都很慢,而且使用环视正则表达式也很慢。如果可能,应在正则表达式开始之前尝试使用长前缀。【ps,正在表达式,在日志系统使用较多,后面在Logstash系列,TeHero再为大家讲解】

2) type query

筛选与提供的文档/映射类型匹配的文档。【几乎无用,因为 type 在7.x已被弃用,并将在8.x版本中被删除】

GET /your_index/_search
{"query": {"type" : {"value" : "_doc"}}
}

3) ids query

根据index的_id 字段检索文档

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

08 总结

到此我们已经学完Term-level queries 的11种查询,下面我们进行一个简单的总结:

1、 所有的 Term-level queries 的检索关键词都不会分词;
2、term query 等价于sql【where Token = “检索词”】;
3、terms query 等价于sql【where Token in ( 检索词List )】;
4、range query 掌握Date Math 和对 range类型字段检索的 relation参数;
5、掌握 wildcard query、prefix query、fuzzy query 这3种模糊查询;
6、terms_set query 用于检索Array类型的字段,但文档中必须定义一个数字字段——表示最低匹配的term数量;
7、exists query 用于检索为null的字段,检索不为null的字段使用 must_not + exists。
下期预告:Compound queries之Bool query【关注公众号:方才编程,系统学习ES

待续

b577723b059464cd86c1abb9d3d39295.gif

●ES系列05:倒排序索引与分词Analysis●ES系列09:Term-level queries(1)●ES系列10:Term-level queries 之 Range query

http://weixin.qq.com/r/N0QwKK-EyvK1retL9xEl (二维码自动识别)

d635fcded822cd22237b5550358e3651.png

你点的每个赞,我都认真当成了喜欢



推荐阅读
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
author-avatar
丹丹2502912601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有