Elasticsearch:使用 query_string 查询的短语及模糊查询

本文介绍了如何在Elasticsearch中使用query_string查询进行短语搜索和模糊查询。通过示例展示了短语必须用引号和转义字符表示,以及如何利用slop参数处理短语中单词的缺失。同时,讨论了模糊查询的用法,包括使用波浪号(~)运算符进行拼写错误容忍,以及默认的编辑距离和如何调整它。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我之前的文章系列里,我详细描述了 query_string 的一些功能:

在今天的文章中,我们来聊聊 query_string 中的一下特殊查询。

使用 query_string 查询的短语查询

如果您想知道是否支持使用 query_string 进行短语搜索,确实有。 我们唯一需要注意的是短语必须用引号引起来。 也就是说,对应于该短语的引号必须被转义; 例如,"query": "\"Design Patterns\""。 下一个清单中的查询搜索一个短语。

PUT books/_doc/1
{
  "synopsis": "I am making the code better"
}

GET books/_search
{
  "query": {
    "query_string": {
      "query": "\"making the code better\"",
      "default_field": "synopsis"
    }
  }
}

上面讲返回如下的结果:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.1507283,
    "hits": [
      {
        "_index": "books",
        "_id": "1",
        "_score": 1.1507283,
        "_source": {
          "synopsis": "I am making the code better"
        }
      }
    ]
  }
}

如果我们做如下的搜索:

GET books/_search
{
  "query": {
    "query_string": {
      "query": "\"making the better code\"",
      "default_field": "synopsis"
    }
  }
}

在上面,我们把 code 及 better 调换过来,我们发现就没有搜索到结果。很显然这是一个 phrase 查询。

顺其自然,如果短语中缺少一两个单词,我们可以使用 slop 参数。

例如,以下清单中的代码演示了 phrase_slop 参数如何允许短语中缺少单词(the 从短语中删除)并且仍然获得成功的结果。

GET books/_search
{
  "query": {
    "query_string": {
      "query": "\"making code better\"", 
      "default_field": "synopsis",
      "phrase_slop": 1 
    }
  }
}

上面的搜索可以搜索到我们之前写入的文档。查询遗漏了一个词,但是 phrased_slop 设置原谅了遗漏,因此,我们得到了想要的结果。

同样地,我们可以针对如下的搜索来进行:

GET books/_search
{
  "query": {
    "query_string": {
      "query": "\"making the code better\"",
      "default_field": "synopsis",
      "phrase_slop": 2
    }
  }
}

在上面,尽管 code 和 better 是倒置的,我们需要设置 phrase_stop 为 2 才可以搜索到。有关 slop 的定义,请详细阅读文章 “开始使用 Elasticsearch (2)” 中的 “匹配短语” 章节。

使用 query_string 查询的模糊查询

我们还可以通过使用带有 query_string queries 的模糊查询来要求 Elasticsearch 原谅拼写错误。 我们需要做的就是在查询条件后面加上波浪号 (~) 运算符。

下面的清单演示了一个示例,可以最好地理解这一点。

PUT books/_doc/2
{
  "title": "I like these patterns"
}

GET books/_search
{
  "query": {
    "query_string": {
      "query": "Pattenrs~", 
      "default_field": "title"
    }
  }
}

上面搜索的结果为:

{
  "took": 853,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.25172183,
    "hits": [
      {
        "_index": "books",
        "_id": "2",
        "_score": 0.25172183,
        "_source": {
          "title": "I like these patterns"
        }
      }
    ]
  }
}

通过使用 ~ 运算符设置后缀,我们请求引擎将查询视为模糊查询。 默认情况下,使用模糊查询时使用的编辑距离为 2。

编辑距离是将一个字符串转换为另一个字符串所需的突变数。 例如,“CAT” 需要编辑距离为 1 才能将其转换为“CAP”。有关这个编辑距离的更多知识,请参阅文章 “Elasticsearch:fuzzy 搜索 (模糊搜索)”。

查询使用 Levenshtein 距离算法来支持模糊查询。 然而,还有另一种类型的编辑距离算法,称为 Damerau–Levenshtein 距离算法。 事实上,Damerau–Levenshtein 距离用于支持模糊查询。 它支持最多两个字符的插入、删除或替换,以及相邻字符的调换。

> Levenshtein 距离算法定义了将一个字符串转换为另一个字符串所需的最少突变数。 这些突变包括插入、删除和替换。 Damerau–Levenshtein 距离算法更进了一步。 除了具有 Levenshtein 定义的所有突变之外,Damerau-Levenshtein 算法还考虑了相邻字符的转置(例如,TB-> BT -> BAT)。

默认情况下,query_stringquery 中的编辑距离为 2,但如果需要,我们可以通过在波浪号后设置 1 来减少它,如下所示:“Patterns~1”。比如:

GET books/_search
{
  "query": {
    "query_string": {
      "query": "Pattenrs~1", 
      "default_field": "title"
    }
  }
}

上述搜索结果将返回我们之前输入的文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值