【问题标题】:Does tokenizer work for indexing or query or both in Elasticsearch?标记器是否适用于 Elasticsearch 中的索引或查询或两者?
【发布时间】:2020-01-23 04:04:59
【问题描述】:

我在 Elasticsearch 6.8 中查看 tokenizer。我知道它定义了我们在构建索引时如何将文本标记为单词。例如,它将“Quick brown fox!” 文本转换为术语[Quick, brown, fox!]。 如果我在 Elasticsearch 中有一个包含文本 "Quick brown fox!" 的字段,它将在索引中分成三个单词。 但是如果我发送查询文本"Quick brown fox!"tokenizer 是否也适用于该查询参数?

【问题讨论】:

  • 是的。 (还有 8 个字母)

标签: elasticsearch tokenize elasticsearch-analyzers


【解决方案1】:

只要在索引的字段映射中正确配置分析器,它们就可以在索引时和查询时工作。

On this page,您将获得分析器何时启动的完整描述,为清楚起见,在下面重复:

在索引时,Elasticsearch 将按以下顺序查找分析器:

  • 在字段映射中定义的分析器。
  • 在索引设置中名为 default 的分析器。
  • 标准分析仪。

在查询时,还有几层:

  • 全文查询中定义的分析器。
  • 在字段映射中定义的 search_analyzer。
  • 字段映射中定义的分析器。
  • 索引设置中名为 default_search 的分析器。
  • 在索引设置中名为 default 的分析器。
  • 标准分析仪。

如您所见,分析器既可以在您提取数据时使用,也可以在您查询数据时使用。

【讨论】:

  • 如果我对不同的领域有不同的分析器。当针对这些字段向 ES 发送查询请求时,请求文本会针对不同字段进行不同的标记?我理解正确吗?
  • 每个文本字段都可以有自己的index-timequery-time analyzer,所以是的,您只需要正确配置每个字段/分析器即可。
  • @ZhaoYi,请看一下explain API,正如我的回答中解释的那样,看看ES生成的有效令牌。
【解决方案2】:

您还可以验证您的搜索词是否是分词器,您还可以检查从您的搜索查询中生成的令牌。因为它取决于各种因素,如查询类型、分析查询与非分析查询。

Match queries 是分析查询的示例,其中提供的文本在匹配之前进行分析。而term query 是一个未分析查询的示例,其中提供的搜索文本未按原样进行分析和发送以进行搜索。

要检查搜索查询生成的标记,请使用Explain API,它返回有关特定文档为何匹配(或不匹配)查询的信息。在此查询的输出中,您将能够检查为您的搜索词生成的令牌。

下面是解释 API 输出中的示例 sn-p,它显示了在 Elasticsearch 中基于各种因素生成的搜索词令牌。

"description": "weight(to:Foo in 0) [PerFieldSimilarity], result of:",

此 API 是检查 ES 生成的最终令牌的最快方法,这些令牌用于令牌到令牌的匹配。

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    相关资源
    最近更新 更多