ElasticSearch 自动完成/按令牌建议

Posted

技术标签:

【中文标题】ElasticSearch 自动完成/按令牌建议【英文标题】:ElasticSearch autocomplete/suggest by token 【发布时间】:2022-01-18 03:17:16 【问题描述】:

我想根据我的索引中的tokens(而不是完整的文档)创建搜索建议。

例如: 我有一个简单的 movies 索引,其中包含以下两个文档:

    "name":"Captain America" "name":"American Made"

如果我输入 "ame" 那么我应该得到两个建议(作为标记)

    america american

同样,如果我输入 "cap" 那么我应该得到 "captain" 而不是 "Captain America"

我和这篇文章有完全相同的问题: https://discuss.elastic.co/t/elasticsearch-autocomplete-suggest-by-token/18392

我看过所有类型的建议者,似乎他们专注于返回整个文档而不是令牌。

Apache Solr 通过其自动建议功能满足这一要求:

例如,如果我输入“kni”,那么 Solr 将返回 knivesknifeknit 作为建议(基于来自索引文档的标记)


  "responseHeader":
    "status":0,
    "QTime":19,
  "spellcheck":
    "suggestions":[
      "kni",
        "numFound":3,
        "startOffset":0,
        "endOffset":3,
        "suggestion":["knives",
          "knife",
          "knit"]],
    "collations":[
      "collation","knives"]

这个 *** 线程中提到了一个可能的解决方案: Elasticsearch autocomplete or autosuggest by token

但它依赖于在每个文档中明确添加所有建议。这似乎是一种乏味的方法。

如果能以更好的方式实现,请告诉我。

提前致谢。

【问题讨论】:

当你搜索 cap 时它不会返回像 America 这样的部分......因为它存储为“Captain America”......你需要将它存储为唯一的 Captain......在你的如果您字段名称的值为“美国队长”...如果您正在为其应用文本字段类型...它可能会为您创建令牌,例如美国队长等...创建这些令牌是为了帮助您搜索...并作为搜索原始文本的响应返回 【参考方案1】:

当您搜索“ame”时,它不会返回像 America 这样的部分,因为它存储为“Captain America”。你得到存储的原始文本

您需要将其存储为仅美国。

在您的情况下,字段名称的值为“美国队长”。 如果您为其应用文本字段类型,它可能会为您创建令牌,例如 Captain、America 等。

这些是在编制索引时创建的令牌,旨在帮助您进行搜索/自动建议。

作为搜索或自动建议的响应,您将获得原始文本。

虽然另一种方法是从自动建议的原始文本的响应中突出显示匹配的术语或术语的一部分。

【讨论】:

以上是关于ElasticSearch 自动完成/按令牌建议的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:构建自动补全功能 - Autocomplete

从自动完成列表提交查询,而无需点击提交按钮

Nest SuggestCompletion 用法,抛出“不是完成建议字段”异常

Elasticsearch 完成建议器

创建一个基本的自动完成建议列表

Elasticsearch之pythonAPI简单使用