elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.htmlhtml
在关系数据库系统里,索引是检索数据最有效率的方式。但对于搜索引擎,它并不能知足其特殊要求,好比海量数据下好比百度或者谷歌要搜索百亿级的网页,若是使用相似关系型数据库使用的B+树索引,可想而知其对cpu的计算能力要求得有多高。其次关系型数据库中通常存储的都是结构化的数据,数据格式都是必定的,操做上通常也都是curd等比较简单的操做。算法
倒排索引区别于正向索引,通常的倒排索引被用来作全文搜索。好比如今有一本10w字的书,单词使用量为3k,我要从中搜索某个词出现的章节,咱们该怎么作?数据库
正排索引:遍历这本书,记录该次出现的章节。咱们几乎要遍历完10w个词才能统计完。elasticsearch
倒排索引:创建倒排索引,将每一个词做为key,该词出现的章节为value。咱们只要在3k个单词中找到咱们的目标词便可。post
这样的话,显然倒排索引对于全文搜索性能更好。(上面举得例子不太好,凑合吧)性能
通常的正排索引是以key找value,而倒排索引则是以value找key。反转了key-value的关系。优化
在es中text类型字段默认只会创建倒排索引,其它几种类型在创建倒排索引的时候还会创建正排索引,固然es是支持自定义的。在这里这个正排索引其实就是Doc Value。本章节咱们主要是介绍倒排索引。下面咱们介绍一个例子,看看倒排索引是如何创建的。ui
好比咱们有两个doc(document 文档),都有一个content字段搜索引擎
doc_1:The quick brown fox jumped over the lazy dogurl
doc_2:Quick brown foxes jump over lazy dogs in summer
首先在es底层分词器会对doc进行分词,获得一个个term(单词),而后创建一个映射关系,记录存在各个单词的文档。首先咱们分析一下各个单词存在的文档。
由于每一个doc都是由id惟一标识的,因此其会创建一个映射关系。
当es创建了这种映射关系,当咱们搜索一个单词的时候,是否是就不须要遍历每一个文档了呢。固然,es的倒排索引并不会这么简单。
term优化,好比咱们用百度搜索“JUmped”这个词
很容易发现,居然区分好了大小写,而且还只能的匹配到了不一样的时态。因此es一样也是这样的,es的分词器会对单词进行必定的处理,好比:
1 大小写转换:Quick --> quick 2 近义词转换:mother --> mom 3 时态转换:jumped --> jump 4 单复数转换:dogs --> dog
......
注意:不一样的分词器的分词方式和算法都是不尽相同的。要注意这一点。
当es进行了term优化以后,咱们再看看这个倒排索引:
当倒排索引如上所示,咱们很容易就能进行全文搜索。
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的经常使用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增长,但同时会随着它在语料库中出现的频率成反比降低。TF-IDF加权的各类形式常被搜寻引擎应用,做为文件与用户查询之间相关程度的度量或评级。除了TF-IDF之外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以肯定文件在搜寻结果中出现的顺序。
Term frequency:搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,就越相关
在es中进行全文搜索时,搜索结果的匹配度也是采用的TF-IDF算法。这个匹配度是可以在es的元数据 _score 属性中体现出来的。经过实验验证一下。
首先创建一个索引
PUT /my_index?pretty
插入数据
1 PUT /my_index/my_index_type/1 2 { 3 "content":"The quick brown fox jumped over the lazy dog" 4 } 5 PUT /my_index/my_index_type/2 6 { 7 "content":"Quick brown foxes jump over lazy dogs in summer" 8 }
搜索
1 GET /my_index/my_index_type/_search 2 { 3 "query":{ 4 "match":{ 5 "content": "quick" 6 } 7 } 8 }
搜索结果
经过以上结果咱们很容易发现,es经过TF-IDF算法计算出来了相关度 _score。而且还勿略了大小写。
若是咱们搜索单词“summer”,结果以下所示,只匹配到了doc1。
参考文献:
《elasticsearch-权威指南》
若有错误的地方还请留言指正。
原创不易,转载请注明原文地址:http://www.javashuo.com/article/p-scqsdanv-bx.html