Stemming和Stop words

在前面章节讲到,分析器是专门处理分词的组件,由三部分组成:

  • Character Filters: 针对原始文本处理,例如去除HTML
  • Tokenizer: 安装规则分词
  • Token Filter : 将切分的单词进行加工、小写,删除stopwords,增加同义词

本节我们介绍两种analyzer, 分别用于提取词干删除停用词

Stemming token filter- 词干提取

为什么要提取词干

下面的一段话中,很多单词具有复数形式、过去式、现在进行式等格式:

image-20220723211738823

如果我们将其插入到文档中, 然后搜索loves时,其实是搜索不到结果的,因为倒排索引保存的是loved形式:

image-20220723211809875

在搜索引擎(baidu或google)搜索loves是能得到loveloved关键词的。所以这就引出了stemming(词干提取)

  • 我们需要loved -> love, drinking -> drink这种模式来存储单词

于是上面的一段话被解析成:

image-20220723211858760

image-20220723212425660

stop words - 删除停用词

每种语言都存在一些非常常见的单词,它们对搜索没有太大价值。在 Elasticsearch 中,英语默认的停用词为:

a, an, and, are, as, at, be, but, by, for, if, in, into, is, it,
no, not, of, on, or, such, that, the, their, then, there, these,
they, this, to, was, will, with

这些 停用词 通常在索引前就可以被过滤掉,同时对检索的负面影响不大。

例如上面的语句可以被过滤为:

image-20220723212047137

但是删除停用词并不一定是好的解决方案,从索引里将这些词移除会使我们降低某种类型的搜索能力。将前面这些所列单词移除会让我们难以完成以下事情:

  • 区分 happynot happy
  • 搜索乐队名称 The The。
  • 查找莎士比亚的名句 “To be, or not to be” (生存还是毁灭)。
  • 使用挪威的国家代码: no

默认Elasticsearch是不会移除停用词的,而且一般也不建议这么做。