索引和搜索分析

编辑

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

索引时
当文档被索引时,任何 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! 匹配。

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

  • QuickQUICK
  • foxfoxes

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

[ 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 开头的单词的词元匹配,这更符合用户的搜索期望。