英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/stemming.html
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
将单词还原为词根edit
大多数语言的单词都可以 词形变化 ,意味着下列单词可以改变它们的形态用来表达不同的意思:
- 单复数变化 : fox 、foxes
- 时态变化 : pay 、 paid 、 paying
- 性别变化 : waiter 、 waitress
- 动词人称变化 : hear 、 hears
- 代词变化 : I 、 me 、 my
- 不规则变化 : ate 、 eaten
- 情景变化 : so be it 、 were it so
虽然词形变化有助于表达,但它干扰了检索,一个单一的词根 词义 (或意义)可能被很多不同的字母序列表达。 英语是一种弱词形变化语言(你可以忽略词形变化并且能得到合理的搜索结果),但是一些其他语言是高度词形变化的并且需要额外的工作来保证高质量的搜索结果。
词干提取 试图移除单词的变化形式之间的差别,从而达到将每个词都提取为它的词根形式。
例如 foxes
可能被提取为词根 fox
,移除单数和复数之间的区别跟我们移除大小写之间的区别的方式是一样的。
单词的词根形式甚至有可能不是一个真的单词,单词 jumping
和 jumpiness
或许都会被提取词干为 jumpi
。
这并没有什么问题—只要在索引时和搜索时产生相同的词项,搜索会正常的工作。
如果词干提取很容易的话,那只要一个插件就够了。不幸的是,词干提取是一种遭受两种困扰的模糊的技术:词干弱提取和词干过度提取。
词干弱提取 就是无法将同样意思的单词缩减为同一个词根。例如, jumped
和 jumps
可能被提取为 jump
,
但是 jumping
可能被提取为 jumpi
。弱词干提取会导致搜索时无法返回相关文档。
词干过度提取 就是无法将不同含义的单词分开。例如, general
和 generate
可能都被提取为 gener
。
词干过度提取会降低精准度:不相干的文档会在不需要他们返回的时候返回。
首先我们会讨论下两个 Elasticsearch 使用的经典词干提取器 — 词干提取算法 和 字典词干提取器 — 并且在 选择一个词干提取器 讨论了怎么根据你的需要选择合适的词干提取器。 最后将在 控制词干提取 和 原形词干提取 中讨论如何裁剪词干提取。