文本分析
文本分析 是将非结构化文本(例如电子邮件正文或产品描述)转换为针对搜索进行了优化的结构化格式的过程。
文本分析使 Elasticsearch 能够执行全文搜索,即搜索返回所有 相关 结果,而不仅仅是精确匹配的结果。例如,如果您搜索 Quick fox jumps,您可能希望找到包含 A quick brown fox jumps over the lazy dog 的文档,并且您可能还希望找到包含相关词汇(如 fast fox 或 foxes leap)的文档。
Elasticsearch 在索引或搜索 text 字段时会执行文本分析。如果您的索引不包含 任何 text 字段,则无需进行进一步设置;您可以跳过本节中的页面。如果您 确实 使用了 text 字段,或者您的文本搜索结果不如预期,配置文本分析通常会有所帮助。如果您使用 Elasticsearch 来执行以下操作,也应该研究一下分析配置:
- 构建搜索引擎
- 挖掘非结构化数据
- 针对特定语言微调搜索
- 执行词典学或语言学研究
分析通过 分词 (tokenization) 使全文搜索成为可能:即将文本拆分为更小的块,称为 词元 (tokens)。在大多数情况下,这些词元是单个单词。
如果您将短语 the quick brown fox jumps 作为单个字符串进行索引,而用户搜索 quick fox,则不会被视为匹配。但是,如果您对该短语进行分词并将每个单词单独索引,查询字符串中的术语就可以单独查找。这意味着它们可以被 quick fox、fox brown 或其他变体的搜索所匹配。
分词支持对单个术语进行匹配,但每个词元仍然是字面匹配。这意味着:
- 搜索
Quick不会匹配quick,即使您可能希望这两个术语能相互匹配 - 尽管
fox和foxes共享同一个词根,但搜索foxes不会匹配fox,反之亦然。 - 搜索
jumps不会匹配leaps。虽然它们不共享词根,但它们是同义词且含义相似。
为了解决这些问题,文本分析可以将这些词元 归一化 (normalize) 为标准格式。这使您能够匹配与搜索词不完全相同、但足够相似以至于仍然相关的词元。例如:
Quick可以转换为小写:quick。foxes可以进行 词干提取 (stemmed),即还原为词根:fox。jump和leap是同义词,可以作为同一个词进行索引:jump。
为确保搜索词按预期匹配这些单词,您可以对查询字符串应用相同的分词和归一化规则。例如,搜索 Foxes leap 可以归一化为搜索 fox jump。
文本分析由 分析器 (analyzer) 执行,这是一套用于管理整个过程的规则。
Elasticsearch 包含一个默认分析器,称为 标准分析器 (standard analyzer),它开箱即用,适用于大多数用例。
如果您想定制搜索体验,可以选择不同的 内置分析器,甚至可以 配置自定义分析器。自定义分析器让您可以控制分析过程的每一步,包括:
- 分词 之前 对文本的更改
- 文本如何转换为词元
- 在索引或搜索之前对词元进行的归一化更改