一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表,还可以记录单词在某个文档出现的位置信息
索引规则
首先这里有两条文档记录
- The quick brown fox jumped over the lazy dog
- Quick brown foxes leap over lazy dogs in summer
这两句话存储时,一个个的词被拆开了存储
我们查询
quick brown
的时候计算相关度分数时,文档1的匹配度高,匹配度分数会比文档2高
标准化规则
- 查询出现大小写
查询Quick
或者quick
,用户可能认为它们是相同的词 - 查询出现语义相同的词
fox
和foxes
非常相似,dog 和
dogs,
jumped和
leap`, 尽管没有相同的词根,但他们的意思很相近。他们是同义词
使用标准化规则(normalization):
建立倒排索引的时候,会对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率
再来一个示例
存储5条文档数据,可以理解为正排索引,根据key,也就是文档编号id找到相应内容
建立倒排索引,根据内容找到文档的编号id
为什么ES比MYSQL数据量很大时,ES快呢,正是由于上图数据存储机制有关的,数据几个亿的时候,由于分词存储成倒排索引,全人类的单词或者汉字词语,也是一个定数,但是数据的存储可是无限的,mysql通过正向的数据扫描,显然是数据越多越吃力的
分词
强大的存储,离不开分词器的支持
分词器 : 从一串文本中切分出一个一个的词条,并对每个词条进行标准化
包括三部分:
- character filter:分词之前的预处理,过滤掉HTML标签,特殊符号转换等
- tokenizer:分词
- token filter:标准化
内置分词器:
- standard 分词器:(默认的)他会将词汇单元转换成小写形式,并去除停用词和标点符号,支持中文采用的方法为单字切分
- simple 分词器:首先会通过非字母字符来分割文本信息,然后将词汇单元统一为小写形式。该分析器会去掉数字类型的字符。
- Whitespace 分词器:仅仅是去除空格,对字符没有lowcase化,不支持中文;
并且不对生成的词汇单元进行其他的标准化处理。 - language 分词器:特定语言的分词器,不支持中文
一个牛逼的中文分词器 analysis-ik
关系型数据库自己构建全文索引存储
php 中文分词器 SCWS 或者 PHPAnalysis 通过分词存储到mysql中,自己构建倒排索引进行存储,搜索时也可再加入自己的搜索分数规则进行搜索