请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
处理人类语言
edit处理人类语言
edit
“我认识这句话里的所有单词,但并不能理解全句。” |
||
-- Matt Groening |
全文搜索是一场 查准率 与 查全率 之间的较量—查准率即尽量返回较少的无关文档,而查全率则尽量返回较多的相关文档。 尽管能够精准匹配用户查询的单词,但这仍然不够,我们会错过很多被用户认为是相关的文档。 因此,我们需要把网撒得更广一些,去搜索那些和原文不是完全匹配但却相关的单词。
难道你不期待在搜索“quick brown fox“时匹配到包含“fast brown foxed“的文档,或是搜索“Johnny Walker“时匹配到“Johnnie Walker“, 又或是搜索“Arnolt Schwarzenneger“时匹配到“Arnold Schwarzenegger“吗?
如果文档 确实 包含用户查询的内容,那么这些文档应当出现在返回结果的最前面,而匹配程度较低的文档将会排在靠后的位置。 如果没有任何完全匹配的文档,我们至少可以给用户展示一些潜在的匹配结果;它们甚至可能就是用户最初想要的结果。
以下列出了一些可优化的地方:
-
清除类似
´
,^
,¨
的变音符号,这样在搜索rôle
的时候也会匹配role
,反之亦然。请见 归一化词元。 -
通过提取单词的词干,清除单数和复数之间的差异—
fox
与foxes
—以及时态上的差异—jumping
、jumped
与jumps
。请见 将单词还原为词根。 -
清除常用词或者 停用词 ,如
the
,and
, 和or
,从而提升搜索性能。请见 停用词: 性能与精度。 -
包含同义词,这样在搜索
quick
时也可以匹配fast
,或者在搜索UK
时匹配United Kingdom
。 请见 同义词。 -
检查拼写错误和替代拼写方式,或者 同音异型词 —发音一致的不同单词,例如
their
与there
,meat
、meet
与mete
。 请见 拼写错误。
在我们可以操控单个单词之前,需要先将文本切分成单词,这也意味着我们需要知道 单词 是由什么组成的。我们将在 词汇识别 章节阐释这个问题。
在这之前,让我们看看如何更快更简单地开始。