学习Elasticsearch的第二天 倒排索引

357 阅读2分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

一个问题 : 数据库可以提供select功能 ,为什么要用搜索引擎?

传统搜索方式就是根据关键词 去内容中一一比对,比对到了拿出来,比如我手里有个关键词叫 "学习" ,就会拿着这个词去一条条比对,找到则拿出俩,也就是根据key 去寻找value,这就是正排索引

引出我们今天的主角倒排索引

Elasticsearch 是要将数据导入进去再进行搜索服务的,导入的时候就会进行分词, 例如文章中有 10条“学习”,Elasticsearch就会对这10条数据进行编号,当我们再次查询“学习”的时候,因为已经分词了,就会把分词返回去,所以不需要一条条比对

举个栗子 现在有2条内容

  • 0. "it is what it is"
  • 1. "what is it"
  • 2. "it is a banana" 这会被分词分成如下的样子
"a":      {(2, 2)}
"banana": {(2, 3)}
"is":     {(0, 1), (0, 4), (1, 1) , (2, 1)}
"it":     {(0, 0), (0, 3), (1, 2) , (2, 0)} 
"what":   {(0, 2), (1, 0) }

检索的条件"what""is" 和 "it" 将对应这个集合:{{0,1}n{0,1,2}n{0,1,2}={0,1}}

如果我们执行短语搜索"what is it" 我们得到这个短语的全部单词各自的结果所在文档为文档0和文档1。但是这个短语检索的连续的条件仅仅在文档1得到。

现在解释了速度的问题,还有一个问题就是兼容性 一个小例子

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

Quick 和 quick 以独立的词条出现,然而用户可能认为它们是相同的词。 fox 和 foxes 非常相似, 就像 dog 和 dogs ;他们有相同的词根。 jumped 和 leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词。

如果我搜查 "Quick fox" 就会出现问题,因为 Quick 与 fox 不在同一个文档。

Elasticsearch将词条规范为标准模式,那么可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档。

Quick 可以小写化为 quick 。 foxes 可以 词干提取 --变为词根的格式-- 为 fox 。类似的, dogs 可以为提取为 dog 。 jumped 和 leap 是同义词,可以索引为相同的单词 jump 。

这样处理之后,我们成功了么?

并没有!

现在搜索搜索 Quick fox 仍然 会失败 在我们的索引中,已经没有 Quick 了。但是,如果我们对搜索的字符串使用与 content 域相同的标准化规则,会变成查询 +quick +fox ,这样两个文档都会匹配!

官网原文:www.elastic.co/guide/cn/el…