这是我参与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得到。
现在解释了速度的问题,还有一个问题就是兼容性 一个小例子
- The quick brown fox jumped over the lazy dog
- 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
,这样两个文档都会匹配!