添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

引子:DSL 和SQL中模糊查询一样吗

大家好,我是马儿
今天来说一下模糊查询的事,我们使用关系型数据库时,模糊查询使用的就是like,加上通配符

通配符 说明
% 包含0个或多个字符的任意字符
_(下划线) 任意1个字符

那ElasticSearch中模糊查询是什么呢,我们知道term是精确查询,有的地方说match是模糊,有的地方说wildcard是模糊,甚至还有fuzzy等,字面意思就是‘模糊’的语句,他们有什么区别呢

ElasticSearch中的模糊查询

举个例子,我们有个人物名单索引listofhistoricalfigures
里面name字段内容如下

  1. 张三
  2. 张三丰
  3. 张飞
  4. 三德子
  5. 张二丰
  6. 孙权
  7. 马三丰

结构是下面这样,text支持分词查询,keyword支持精确查询
详情可参考这一篇
ElasticSearch 使用term时.keyword加不加的区别

"name" : { "type" : "text" , "fields" : { "keyword" : { "type" : "keyword"

match 分词匹配检索

match
英 [mætʃ] 美 [mætʃ]
n. 火柴;比赛;竞赛;敌手;旗鼓相当的人
v.般配;相配;相同;相似;相一致;找相称(或相关)的人(或物);配对

match字面意思是 相似;相一致;找相称(或相关)的人(或物);配对

GET listofhistoricalfigures/_search 
    "query": {
        "match": {
            "name": "张三"

我们使用match和默认分词器,会把张三进行分词,分成张、三、张三进行检索
会匹配到的结果有

wildcard 通配符检索

wildcard
美 [ˈwaɪldˌkɑrd]
n.未知数;未知因素;(给予没有正常参赛资格的选手准其参加比赛的)“外卡”;“外卡”选手;
(用于代替任何字符或字符串的)通配符

wildcard字面意思是 通配符

GET listofhistoricalfigures/_search 
    "query": {
        "wildcard": {
            "name.keyword": "张三*"

使用wildcard相当于SQL的like,前后都可以拼接*,表示匹配0到多个任意字符
加.keyword是要匹配完整的词
会匹配到的结果有

fuzzy 模糊/纠错检索

fuzzy
英 [ˈfʌzi] 美 [ˈfʌzi]
adj. 覆有绒毛的;毛茸茸的;紧鬈的;拳曲的;(形状或声音)模糊不清的

fuzzy字面意思是 模糊

GET listofhistoricalfigures/_search 
    "query": {
        "fuzzy": {
            "name.keyword": "张三"

使用fuzzy就行百度一样,你输入个“邓子棋”,也能把“邓紫棋”查出来,有一定的纠错能力
加.keyword是要匹配完整的词
会匹配到的结果有

1.match 分词匹配检索,可以对查询条件分词,查到更多匹配的内容,结合不同的分词器,可以得到不同的效果

2.wildcard 通配符检索功能就像传统的SQL like一样,如果数据在es,你又想得到传统的“模糊查询”结构时,用wildcard

3.fuzzy 纠错检索,让输入条件有容错性

目录引子:DSL 和SQL中模糊查询一样吗ElasticSearch中的模糊查询match 分词匹配检索wildcard 通配符检索fuzzy 模糊/纠错检索结论引子:DSL 和SQL中模糊查询一样吗大家好,我是马儿今天来说一下模糊查询的事,我们使用关系型数据库时,模糊查询使用的就是like,加上通配符通配符说明%包含0个或多个字符的任意字符_(下划线)任意1个字符那ElasticSearch中模糊查询是什么呢,我们知道term是精确查询,有的地方说match是 1.1 需求描述 用Elasticsearch 实现类似SQLlike的功能('%aaa%'),查询数据时,要前后模糊匹配,不要分词(用户输入AAA,检索的结果AAA需要连在一起,不能是AABA) 1.2 所需知识点 1.2.1 phrase-matching phrase-matching 短语匹配 类似 match 查询match_phrase 查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含全部搜索词项,且位置与搜索词项相同的文档。 比如对于quick
1、match查询:会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。 2、match_phrase查询match_phrase与slop一起用,能保证分词间的邻近关系,slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配,默认是0。为0时 必须相邻才能被检索出来。 例如下面的语句,会把“白雪公主吃苹果”...
multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询,即对指定的多个字段进行match查询,其有三种类型, best_fields,most_fields以及cross_fields,默认为best_fields。 比如使用同一个查询关键字同时在company和place查询: GET 51job/_doc/_search "query": { "multi_match" : { "query" 1.match 分词匹配检索,可以对查询条件分词,查到更多匹配的内容,结合不同的分词器,可以得到不同的效果 2.wildcard 通配符检索功能就像传统的SQL like一样,如果数据在es,你又想得到传统的“模糊查询”结构时,用wildcard 3.fuzzy 纠错检索,让输入条件有容错性
ES模糊查询wildcard的替代方案,nGram + match_phrase 1.ES模糊查询wildcard查询极耗机器CPU资源,查询耗时高,当并发量高时影响ES其它进程。 2.用户实际的模糊查询需求大多是左右模糊匹配。 可行性分析 match_phrase能够实现词组查询。 比如brown fox会返回匹配…brown fox…的结果,此结果与wildcard查询传入brown fox的查询结果一致。相当于我们可以通过match_phrase实现一些特许的模糊查询需求。 那如何对match_
在实际的搜索,我们有时候会打错字,从而导致搜索不到。在Elasticsearch,我们可以使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形。 match查询具有“fuziness”属性。它可以被设置为“0”, “1”, “2”或“auto”。“auto”是推荐的选项,它会根据查询词的长度定义距离。 Fuzzy query 返回包含与搜索词相似的词的文档,以Levens...
Elasticsearch 是一个开源搜索引擎,它提供了多种查询方式。 match_phrase: 是短语匹配,它会把查询的文本作为一个整体来匹配,保证匹配的文本顺序一致。 wildcard: 通配符匹配,可以使用 * 和 ? 匹配任意字符。 match: 是文本匹配,它会对查询的文本进行分词,然后匹配分词后的文本。 match_phrase: 短语匹配 wildcard: 通配符匹配 value:查询的关键字 boost:查询的权值,默认值是1.0 min_similarity:设置匹配的最小相似度,默认值为0.5, 对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天 prefix_length:指明区分词项的共同前缀长度,默认是0 max_expansions:查询的词项可以扩展的数目,...
Elasticsearch 7.9 ,我们将引入一种新的 “wildcard” 字段类型,该字段类型经过优化,可在字符串值快速查找模式。这种新的字段类型采用了一种全新的方式来索引字符串数据,从而解决了在日志和安全性数据高效索引和搜索的最佳实践。根据你现有的字段用法,通配符可以提供: 更简单的搜索表达式(无需将 AND /单词/短语组合在一起) 更简单的索引编制(无需定义分析器选择) 不再有的缺失值 更快的搜索 更少的磁盘使用 这种新数据类型最令人兴奋的功能是简化了部分匹配。使用通配符,你
const convert = require('elasql').convert convert('SELECT id,name FROM shop WHERE shop_id BETWEEN 5 AND 10 AND type = "cat"') "query": { "bool": { "must": [ "match": { "type": "cat" "must_not": [], "filter": [
SpringBoot:使用application/octet-stream 流式上传大文件,解决Mutipartfile multipart/form-data上传产生临时文件问题 HashMap、ConcurrentHashMap 一行代码实现批量删除元素