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

带着问题学习才高效

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

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

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

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

待续

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

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

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

es 模糊查询_ES系列11:Term-level queries 之 3种模糊查询和terms_set query相关推荐

  1. 如何查询计算机已连接wife的密码错误,三种方法查询已连接 WiFi 的密码,简单实用!...

    因为记性差,经常忘记各种密码,比如 WiFi 密码,当有朋友问到家里的无线网密码时,你就愣住了,俩人在那边干瞪眼.为了帮助大家解决这个尴尬问题,小编现在介绍三种方法,可以查询已经连接的 WiFi 的密 ...

  2. 10.term level 查询

    文章目录 1. term level查询总结 2. 样例 1 . exists query 2 . fuzzy query 3 . ids query 4 . prefix query 5 . ran ...

  3. java term_[ElasticSearch]Java API 之 词条查询(Term Level Query)

    1. 词条查询(Term Query) 词条查询是ElasticSearch的一个简单查询.它仅匹配在给定字段中含有该词条的文档,而且是确切的.未经分析的词条.term 查询 会查找我们设定的准确值. ...

  4. 【GPU精粹与Shader编程】(一) 开篇 全系列11本书核心知识点总览

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处   文章链接: https://zhuanlan.zhihu.com/p/34917895 系列文章前言 <GPU Gems>1 ...

  5. 狂神学习系列11:SpringBoot

    狂神学习系列11:SpringBoot 声明: 本文章是基于狂神的课程所编写,本人才疏学浅,内容仅作参考 项目和markdown文件资料: 07_SpringBoot: 基于狂神说SpringBoot ...

  6. elasticsearch 查询(match和term)

    elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...

  7. webgis从基础到开发实践_开源WebGIS教程系列——11.1 GISLite 的开发背景与设计

    地理信息门户可以帮助人们更容易地发现.访问和使用地理空间信息, 是地理信息发布.服务和共享的重要环节.许多国家都很重视地理信息门户的 建设,把它作为国家空间数据基础设施(spatial data in ...

  8. kubernetes系列11—PV和PVC详解

    kubernetes系列11-PV和PVC详解 原文:kubernetes系列11-PV和PVC详解 本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 ...

  9. es 创建索引_es的基本原理和操作文档

    来源:https://blog.csdn.net/wanbf123/article/details/81504097 一.背景知识 1.搜索的分类 我们想要寻找某些信息的时候,一般会直接去百度.谷歌. ...

最新文章

  1. android h5使用缓存_程序员必须了解的之小程序 与 App 与 H5 之间的区别
  2. flutter 动画展开菜单_多级菜单栏展开隐藏动画
  3. C#多线程 我的第一个多线程程序
  4. Python | threading05 - 使用有界信号量,实现线程间同步
  5. 以变制变——前端动态化代码保护方案探索
  6. 面试记录:题都没答就走了
  7. Linux服务器校准时间
  8. 如何用python 巡检华为交换机?
  9. 永磁同步电机MTPA与id=0的控制原理
  10. 乘幂法求主特征值和特征向量(C++)
  11. 网络安全应急响应-流量分析技术
  12. 运算放大器---封装尺寸
  13. SPARC架构下的反汇编(四)——SPARC汇编语言(二)
  14. select函数的分析
  15. 【面试题】计算机网络常见面试题
  16. (六)sql事务的处理commit,rollback的用法总结
  17. 函数的返回值 return(基础)
  18. 合并 Excel 的多张工作表Sheet报错:无法在此处粘贴此内容
  19. 用python画路飞代码_80行代码!用Python做一个哆来A梦分身
  20. Python金融数据挖掘 第7章 第3节 (7) 案例:基于股评文本的情绪分析

热门文章

  1. 春节福利:《Oracle性能优化与诊断案例精选》电子版首次公开下载
  2. 带你掌握java反序列化漏洞及其检测
  3. 毕业季offer怎么拿?收下这份非典型求职面试指南
  4. 6大创新技术及2亿美元投入计划,这个活动有点料
  5. AI大有可为:NAIE平台助力垃圾分类
  6. linux将mysql中得配置为可读写_MySQL注入 利用系统读、写文件
  7. 合数分解质数c语言算法,合数分解成质数之和问题探究
  8. C++ 链表 leetcode习题总结
  9. Convolutional networks for fast, energy-efficient neuromorphic computing
  10. CNN图像分类Keras代码转换pytorch思路与实现