Elasticsearch模糊查询精讲

目录

一.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(磁条级搜索)总结大全

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,Elasticsearch 中的模糊查询可以通过使用模糊查询(Fuzzy Query)和通配符查询(Wildcard Query)来实现。 1. 模糊查询(Fuzzy Query):模糊查询是指在搜索时根据查询条件中的一个词来匹配文档中的一个或多个词,而不是完全匹配该查询条件。模糊查询可以通过使用 “fuzzy” 查询来实现,例如: ``` GET /my_index/_search { "query": { "fuzzy": { "title": { "value": "quick" } } } } ``` 在上面的查询中,会匹配包含 “quick” 以及类似于 “quack”、“quicker”、“quickest” 等单词的文档。 2. 通配符查询(Wildcard Query):通配符查询是指在搜索时使用通配符来匹配文档中的一个或多个词。通配符查询可以通过使用 “wildcard” 查询来实现,例如: ``` GET /my_index/_search { "query": { "wildcard": { "title": { "value": "qu*" } } } } ``` 在上面的查询中,会匹配包含以 “qu” 开头的单词的文档,如 “quick”、“quality”、“question” 等。 需要注意的是,使用模糊查询和通配符查询会影响搜索性能,因此在使用时需要谨慎。同时,Elasticsearch 中还有其他类型的查询,可以根据具体情况选择使用。 ### 回答2: ElasticSearch是一个开源的搜索引擎,拥有强大的全文搜索和分析能力。在ElasticSearch中,模糊查询是一种常见的查询类型,用于找到与指定的搜索词或短语相似或相关的文档。 在ElasticSearch中,模糊查询可以通过使用通配符、模糊匹配、近似匹配和相似度匹配等方式实现。通配符查询可以使用通配符符号(*或?)匹配多个字符或单个字符。模糊匹配则使用模糊符号(~)指示查询应该接受的编辑距离,从而找到与搜索词相似但不完全匹配的文档。 另外,近似匹配允许搜索在单词之间添加或删除字符,以便更好地匹配查询词。相似度匹配则是利用TF-IDF算法计算词项的相对权重,从而找到与搜索词相似度最高的文档。 为了进行模糊查询,需要使用ElasticSearch提供的查询DSL语句。在查询语句中,可以使用模糊查询子句(fuzzy)指定需要进行模糊查询的字段和搜索词,以及匹配的模糊程度等参数。 不过需要注意的是,模糊查询可能会导致查询时间延长和性能下降,特别是在大数据集下。因此,在使用模糊查询时,需要权衡查询的结果精确性和查询性能之间的平衡。 总而言之,ElasticSearch模糊查询提供了灵活的搜索功能,可以帮助用户找到与搜索词相似或相关的文档。但在使用模糊查询时,需要根据具体情况选择合适的查询方式,并注意查询性能的优化。 ### 回答3: Elasticsearch是一个开源的搜索引擎,它提供了丰富的查询功能,包括模糊查询模糊查询是一种在搜索过程中允许存在一定的匹配误差的查询方式。 在Elasticsearch中,我们可以使用模糊查询来处理那些可能存在拼写错误或者其他差异的搜索请求。使用模糊查询可以找到与搜索关键词相似的文档,即使这些文档可能与搜索关键词不完全匹配。 Elasticsearch提供了多种方式来实现模糊查询。其中一种方式是使用模糊匹配查询(fuzzy match query)。通过指定一个最大编辑距离(max_edit_distance),我们可以控制模糊查询的容忍度。编辑距离指的是将一个词语转换成另一个词语所需要的最少操作次数(插入、删除、替换)。 另一种实现模糊查询的方式是使用通配符查询(wildcard query)。通配符查询支持在搜索关键词中使用通配符符号(*或?),表示匹配任意字符(*)或者匹配单个字符(?)。 另外,通过使用编辑距离相似度(edit distance similarity)计算,Elasticsearch还可以为搜索结果打分。这意味着匹配度较高的文档将排在搜索结果列表的前面。 综上所述,Elasticsearch模糊查询功能可以帮助我们处理那些可能存在一定误差的搜索请求,提高搜索的准确性和召回率。通过合理选择最大编辑距离、使用通配符和应用编辑距离相似度计算,我们可以灵活地控制模糊查询的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr Tang

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值