elasticsearch学习11--Term-level queries之三种模糊查询、exists query与terms_set query

本文采用的数据是elasticsearch学习10–Term-level queries之Range query中添加的。

首先讲三种模糊查询wildcard query、prefix query和fuzzy query

1、wildcard query

通配符 *:它匹配任何字符序列(包括空字符)
占位符?:它匹配任何单个字符。
请注意,此查询的速度可能很慢,因为它需要迭代许多项。为了防止极慢的通配符查询,通配符术语不应以通配符*或?之一开头。

1)通配符 *

POST /blogs_index/_search
{
    "query": {
        "wildcard" : { "author": "大*" }
    }
}

结果分析:可以检索到所有文档。等价于sql【where author like "方%”】

2)占位符 ?

POST /blogs_index/_search
{
    "query": {
        "wildcard" : { "author": "大?" }
    }
}

结果分析:检索结果为空。等价于sql【where author like "方_”】

2、prefix query

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

POST /blogs_index/_search
{ "query": {
    "prefix" : { "author": "大" }
  }
}

结果分析:等价于 wildcard query 的 “wildcard” : { “author”: “大*” },等价于sql【where
author like "大%”】

3、fuzzy query

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

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

POST /blogs_index/_search
{
    "query": {
        "fuzzy" : {
            "author": {
                "value": "大依哥",
                "fuzziness": 1,
                "prefix_length": 1,
                "max_expansions": 100
            }
        }
    }
}

参数解释:

fuzziness:最大编辑距离(例如:"大依哥"和"大衣哥"只有一个字不一样,此时fuzziness就为1,"大衣哥"和"大衣哥俩"fuzziness也为1)
prefix_length:不会被“模糊化”的初始字符数。这有助于减少必须检查的术语数量(默认为0)。(上例中,相当于“大”字必须有才能查询到)
max_expansions:fuzzy查询将扩展到的最大术语数。默认为50。
transpositions:是否支持模糊转置(ab→ba)。默认值为false。

结果分析:等价于sql【where author like “大_哥”or author like “大依_”or author like “大_依哥”or author like “大依_哥”or author like “大依哥_”】(会根据上述的4个参数穷尽所有可能组合)

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

说完了三个模糊查询,再来看看exists query和terms_set query

4、exists query

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

注意:这些值不属于空值
1、空字符串,例如"“或”-"
2、包含null和另一个值的数组,例如[null, “foo”]
3、自定义null-value,在字段映射中定义

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

2)查询为null的字段,应该使用:must_not + exists【ps:关于bool语句后续将会介绍】

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

5、terms_set query

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

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

先准备一下数据

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
}

注意:控制必须匹配术语数量的字段(required_matches)必须是数字字段。

1)minimum_should_match_field

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

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

2)minimum_should_match_script

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

与上一句等价

3)与match query的比较

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

POST /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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值