在 Elasticsearch 中,tokenizer 是否用于索引或查询或两者兼而有之?

Does tokenizer work for indexing or query or both in Elasticsearch?

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

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

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

At index time, Elasticsearch will look for an analyzer in this order:

  • The analyzer defined in the field mapping.
  • An analyzer named default in the index settings.
  • The standard analyzer.

At query time, there are a few more layers:

  • The analyzer defined in a full-text query.
  • The search_analyzer defined in the field mapping.
  • The analyzer defined in the field mapping.
  • An analyzer named default_search in the index settings.
  • An analyzer named default in the index settings.
  • The standard analyzer.

正如您所见,在提取数据和查询数据时都可以利用分析器。

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

Match queries are an example of an analyzed query where the provided text is analyzed before matching. while term query 是未分析查询的示例,其中提供的搜索文本未按原样进行分析和发送以用于搜索。

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

下面是解释 API 的输出示例片段,它显示了 Elasticsearch 基于各种因素生成的搜索词标记。

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

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