Elasticsearch:如何实现短语建议 - phrase suggester

本文介绍Elasticsearch中的短语建议器(phrasesuggester),一种基于ngram语言建模的高级搜索功能,用于纠正短语中的拼写错误,提供相关搜索建议。通过实例演示如何使用短语建议器,并探讨其高级配置选项。

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

词组建议者(phrase suggester)是术语建议者(term suggester)的高级版本。 短语建议者使用的功能是选择整个校正后的短语而不是单个单词。 这是基于 ngram 语言建模的,短语建议者可以基于频率和并发性更好地选择 token。

在本教程中,我们将向你展示如何使用短语建议者来纠正短语中的拼写,这在 Elasticsearch 中提供了 “你的意思是” 的搜索功能。

准备数据

为了能够更好地说明 phrase suggester,首先让我们来建立一个简单的示例数据。我们创建一个具有四个文档的索引 phrase-suggester。我们使用 bulk API 来把数据导入到 Elasticsearch 中去:

POST _bulk
{ "index" : { "_index" : "phrase-suggester", "_id": 1 }}
{ "tagline": "The misty windshield and the dash"}
{ "index" : { "_index" : "phrase-suggester", "_id": 2 }}
{ "tagline": "The misty windshield and the dash"}
{ "index" : { "_index" : "phrase-suggester", "_id": 3 }}
{ "tagline": "windhshield was broken and moist"}
{ "index" : { "_index" : "phrase-suggester", "_id": 4 }}
{ "tagline": "days of misty windshield"}

Phrase suggester 示例

让我们看一下 phrase suggesster 的工作原理。 让我们搜索一个包含三个单词和两个错别字的短语。 这个短语是 “windsheild got mitsy”。 你会看到我们在第一个单词和第三个单词中都有错别字。 使用词组提示器查询索引,看看返回了什么:

GET phrase-suggester/_search
{
  "suggest": {
    "text": "windsheild got mitsy",
    "my-phrase_suggestion": {
      "phrase": {
        "field": "tagline"
      }
    }
  }
}

如你所见,上面的查询与我们在上一篇文章中使用的 term suggester 查询类似,只是 “term” 参数被 “phrase” 参数代替。上述查询返回的结果是:

  "suggest" : {
    "my-phrase_suggestion" : [
      {
        "text" : "windsheild got mitsy",
        "offset" : 0,
        "length" : 20,
        "options" : [
          {
            "text" : "windshield got misty",
            "score" : 0.030922418
          },
          {
            "text" : "windhshield got misty",
            "score" : 0.021743154
          },
          {
            "text" : "windshield got mitsy",
            "score" : 0.018247992
          },
          {
            "text" : "windsheild got misty",
            "score" : 0.017338034
          },
          {
            "text" : "windhshield got mitsy",
            "score" : 0.012831108
          }
        ]
      }
    ]
  }

与 term suggester 非常相似,这些建议在响应的 “options” 数组下列出。 在响应中,我们可以看到选项列表的第一个元素是我们正在寻找的具有最高匹配分数的正确短语。 对于选项列表中的第二个元素,仅纠正了一个错字,而选项列表中的最后一个元素则按原样返回了搜索到的短语。

带有选项的 phrase suggester

在上面的示例中,我们看到了词组建议程序查询的最基本用法。 但是,查询可以配置许多设置,例如突出显示,置信度,整理等,这些设置旨在微调我们的搜索结果。 让我们探索一些最常见的选项。

考虑以下查询以获取短语建议:

GET phrase-suggester/_search
{
  "size": 0,
  "suggest": {
    "text": "windsheild got mitsy",
    "phrase-suggestion-demo-01": {
      "phrase": {
        "field": "tagline",
        "real_word_error_likelihood": 0.95,
        "max_errors": 0.5,
        "confidence": 0,
        "highlight": {
          "pre_tag": "<em>",
          "post_tag": "</em>"
        },
        "collate": {
          "query": {
            "inline": {
              "match": {
                "": ""
              }
            }
          },
          "params": {
            "field_name": "tagline"
          },
          "prune": true
        }
      }
    }
  }
}

我们探讨一下:

  1. real_word_error_likelihood-此选项的默认值为0.95。该选项告诉 Elasticsearch 索引中5%的术语拼写错误。这意味着随着此参数的值降低,Elasticsearch 会将越来越多的存在于索引中的术语视为拼写错误,即使它们是正确的。
  2. max_errors-为了形成更正而最多被视为拼写错误的术语的最大百分比。预设值为1。
  3. confidence-默认值是1.0,最大值也是。该值用作与建议得分相关的阈值。仅显示分数超过此值的那些建议。例如,置信度为1.0只会返回得分高于输入短语的建议。
  4. highlight-高亮功能是最有用的搜索功能之一。也可以在短语建议程序中启用它。更正的单词将使用此关键字突出显示。如以上查询所示,我们还可以采用哪个标签来突出显示(这里我们使用了<em>标签)。
  5. collat​​e-告诉 Elasticsearch 根据指定的查询来检查每个建议,以删除索引中不存在匹配文档的建议。在这种情况下,它是一个匹配查询。由于此查询是模板查询,因此搜索查询是当前建议,位于查询的参数下。可以在查询下的 “params”对象中添加更多字段。同样,当参数 “prune” 设置为 true 时,响应中将有一个附加字段 “collat​​e_match”,指示建议结果中是否所有校正后的关键字都匹配。

上述查询的返回结果为:

  "suggest" : {
    "phrase-suggestion-demo-01" : [
      {
        "text" : "windsheild got mitsy",
        "offset" : 0,
        "length" : 20,
        "options" : [
          {
            "text" : "windshield got misty",
            "highlighted" : "<em>windshield</em> got <em>misty</em>",
            "score" : 0.030922418,
            "collate_match" : false
          },
          {
            "text" : "windhshield got misty",
            "highlighted" : "<em>windhshield</em> got <em>misty</em>",
            "score" : 0.021743154,
            "collate_match" : false
          },
          {
            "text" : "windshield got mitsy",
            "highlighted" : "<em>windshield</em> got mitsy",
            "score" : 0.018247992,
            "collate_match" : false
          },
          {
            "text" : "windsheild got misty",
            "highlighted" : "windsheild got <em>misty</em>",
            "score" : 0.017338034,
            "collate_match" : false
          },
          {
            "text" : "windhshield got mitsy",
            "highlighted" : "<em>windhshield</em> got mitsy",
            "score" : 0.012831108,
            "collate_match" : false
          }
        ]
      }
    ]
  }

在上面的回复中,我们可以看到突出显示的文本,以提出建议的更正。 还有 collate_match,用于响应查询中的 “prune” 参数。 你会看到一个没有两个更正关键字的结果的值为 false。

你可以更改 “confidence”,“ real_word_error_likelihood” 和 “max_errors” 参数的值,并比较更改以更好地理解这些参数。

总结

与术语建议者不同,短语建议者可以将查询与整个短语匹配,并返回最相关的结果。

更多阅读:Elasticsearch:创建一个简单的 “你的意思是?” 推荐搜索​​​​​​​

参考

【1】Suggesters | Elasticsearch Guide [7.5] | Elastic

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值