索引和搜索分析编辑

文本分析发生在两个时间点

索引时间
当索引文档时,任何 text 字段值都会被分析。
搜索时间

text 字段上运行 全文搜索 时,查询字符串(用户搜索的文本)会被分析。

搜索时间也称为查询时间

在每个时间点使用的分析器或分析规则集分别称为索引分析器搜索分析器

索引和搜索分析器如何协同工作编辑

在大多数情况下,应该在索引和搜索时间使用相同的分析器。这确保了字段的值和查询字符串被转换为相同的标记形式。反过来,这确保了标记在搜索期间按预期匹配。

示例

一个文档被索引,在 text 字段中包含以下值

The QUICK brown foxes jumped over the dog!

该字段的索引分析器将值转换为标记并对其进行规范化。在本例中,每个标记都代表一个单词

[ quick, brown, fox, jump, over, dog ]

然后这些标记被索引。

稍后,用户在同一个 text 字段中搜索

"Quick fox"

用户希望此搜索匹配之前索引的句子,The QUICK brown foxes jumped over the dog!

但是,查询字符串不包含文档原始文本中使用的确切单词

  • Quick vs QUICK
  • fox vs foxes

为了解决这个问题,查询字符串使用相同的分析器进行分析。此分析器生成以下标记

[ quick, fox ]

为了执行搜索,Elasticsearch 将这些查询字符串标记与索引在 text 字段中的标记进行比较。

标记 查询字符串 text 字段

quick

X

X

brown

X

fox

X

X

jump

X

over

X

dog

X

由于字段值和查询字符串以相同的方式进行分析,因此它们创建了类似的标记。标记 quickfox 是完全匹配的。这意味着搜索匹配包含 "The QUICK brown foxes jumped over the dog!" 的文档,正如用户预期的那样。

何时使用不同的搜索分析器编辑

虽然不太常见,但在索引和搜索时间使用不同的分析器有时是有意义的。为了实现这一点,Elasticsearch 允许您 指定单独的搜索分析器

通常,只有在使用相同形式的字段值和查询字符串标记会导致意外或不相关的搜索匹配时,才应指定单独的搜索分析器。

示例

Elasticsearch 用于创建仅匹配以提供的前缀开头的单词的搜索引擎。例如,搜索 tr 应该返回 tramtrope,但绝不返回 taxibat

一个文档被添加到搜索引擎的索引中;此文档在 text 字段中包含一个这样的单词

"Apple"

该字段的索引分析器将值转换为标记并对其进行规范化。在本例中,每个标记都代表单词的潜在前缀

[ a, ap, app, appl, apple]

然后这些标记被索引。

稍后,用户在同一个 text 字段中搜索

"appli"

用户希望此搜索仅匹配以 appli 开头的单词,例如 applianceapplication。搜索不应匹配 apple

但是,如果使用索引分析器来分析此查询字符串,它将生成以下标记

[ a, ap, app, appl, appli ]

当 Elasticsearch 将这些查询字符串标记与索引的 apple 的标记进行比较时,它会发现多个匹配项。

标记 appli apple

a

X

X

ap

X

X

app

X

X

appl

X

X

appli

X

这意味着搜索将错误地匹配 apple。不仅如此,它还会匹配以 a 开头的任何单词。

为了解决这个问题,您可以为 text 字段上使用的查询字符串指定不同的搜索分析器。

在本例中,您可以指定一个搜索分析器,它生成单个标记而不是一组前缀

[ appli ]

此查询字符串标记将仅匹配以 appli 开头的单词的标记,这更符合用户的搜索预期。