简介与原理
Elasticsearch是一个基于Lucene库的搜索引擎。
Elasticsearch是最受欢迎的企业搜索引擎
Elasticsearch 是一个实时的分布式搜索分析引擎,它被用作全文检索、结构化搜索、分析以及这三个功能的组合
Elasticsearch 属于面向文档的数据库
Elasticsearch 有2.x、5.x、6.x 三个大版本
搜索的原理——倒排索引(反向索引)、分析、相关性排序
倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。
假设我们有两个文档,每个文档的 content 域包含如下内容:
The quick brown fox jumped over the , lazy+ dog
Quick brown foxes leap over lazy dogs in summer
如果我们想搜索 quick brown ,我们只需要查找包含每个词条的文档:
Term Doc_1 Doc_2
-------------------------
brown | X | X
quick | X |
------------------------
Total | 2 | 1
分析
上面不太合理的地方:
Quick 和 quick 以独立的词条(token)出现,然而用户可能认为它们是相同的词。
fox 和 foxes 非常相似, 就像 dog 和 dogs ;他们有相同的词根。
jumped 和 leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词。
进行标准化:
Quick 可以小写化为 quick 。
foxes 可以 词干提取 --变为词根的格式-- 为 fox 。类似的, dogs 可以为提取为 dog 。
jumped 和 leap 是同义词,可以索引为相同的单词 jump 。
对于查询的字符串必须与词条(token)进行相同的标准化处理,才能保证搜索的正确性。
分词和标准化的过程称为 分析 (analysis) :
首先,将一块文本分成适合于倒排索引的独立的 词条 , -> 分词
之后,将这些词条统一化为标准格式以提高它们的“可搜索性” -> 标准化
分析工作是由分析器 完成的: analyzer
字符过滤器
首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。
分词器
其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
Token 过滤器 (词条过滤器)
最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 a, and, the 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。
相关性排序
默认情况下,搜索结果是按照 相关性 进行倒序排序的——最相关的文档排在最前。
相关性可以用相关性评分表示,评分越高,相关性越高。
Elasticsearch 的相似度算法 被定义为检索词频率/反向文档频率, TF/IDF
检索词频率
检索词在该字段出现的频率?出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。
反向文档频率
每个检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。
字段长度准则
字段的长度是多少?长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。