跟着需求学习ES(二)

236 阅读4分钟

这是我参与 8 月更文挑战的第 5天,活动详情查看: 8月更文挑战

前面我们已经说了为什么选择ES了,今天看看他如何工作;在对海量数据进行处理时就不得不用算法,更好的存储结构来管理这些数据,它和数据库一样,他也有索引,在ES中称为倒排索引,你也可以叫它转置索引;

倒排索引

说起倒排索引,自然要先分开说下倒排、索引, 索引大家都非常清楚,数据库里的聚簇索引、二级索引等大家都已经在数据库那里受到问候了,就不细说了, 计算机恒定的法则,时间换空间;空间换时间!索引就是典型的空间换时间,(在倒排这里表现更为严重,当然这空间消耗的是值得的)将数据以一种特定格式来记录文件的存储位置,从前的数据库的索引是以索引值或者键值ID来进行数据的检索,这样对一般体积的数据没问题,但是对于网页中那么多数据(海量数据),你怎么办,数据库会慢到崩溃,如果用户是模糊查询呢,关联查询呢,你的sql该如何写我也不知道了; 所以倒排的索引采用文件中的关键字来作为key,通过该关键字找到该文件或多个存在该关键字的文件,可是为什么还用索引呢(小白问题),因为数据的检索不可能实时去索引,而是将这些记录以文件方式去存储(即索引),下次直接取这记录的就好了,简单高效(最简单的判断实时就是你百度最新的其他平台信息,当时你可能搜不到,但是一会后也许就可以搜到了), 倒排是“关键词——文档”形式的一种映射结构,

倒排是如何工作的

首先用户输入一些关键字,分词系统会对用户请求的关键字进行分析产生一组组的关键字,这些关键字会去匹配索引列表中对应的关键字,如果算法优良的话,还可以计算关键字搜索出来的文档的相关文档(就像你打错了字,但有时候搜索引擎依然能get到你一样),然后对文档搜索出来的权重进行排序,这方面还有个名字叫SEO,也便是这里做处理了,

上表我只是简单表述一下分词的意思,实际的算法是非常复杂的,你还可以在后面追加单词出现的位置等;

Elasticsearch的内置分词器

  • Standard Analyzer - 默认分词器,按词切分,小写处理

  •  Simple Analyzer - 按照非字母切分(符号被过滤), 小写处理

  • Stop Analyzer - 小写处理,停用词过滤(the,a,is)

  •  Whitespace Analyzer - 按照空格切分,不转小写

  • Keyword Analyzer - 不分词,直接将输入当作输出 

  • Patter Analyzer - 正则表达式,默认\W+(非字符分割) 

  • Language Analyzers - 提供了多语言特定的分析工具 

  • Customer Analyzer 自定义分词器 

分词器的主要组成是:

  1. character filter(字符过滤器):接收原字符流,通过添加、删除或者替换操作改变原字符流。例如:去除文本中的html标签。一个字符过滤器可以有零个或者多个。 
  2.  tokenizer:将一整段文本拆分成一个个的词。例如拆分英文,通过空格能将句子拆分成一个个的词,对于中文来说,无法使用这种方式来实现。只能借助优秀的算法工程师了;在一个分词器中,有且只有一个tokenizeer
  3.  token filters:将切分的单词添加、删除或者改变。例如将所有英文单词小写,或者将英文中的停词a,and,the,or删除等,或者添加一些必要的词。在token filters中,不允许将token(分出的词)的position或者offset改变。同时,在一个分词器中,可以有零个或者多个token filters 

大概的概念就是这些,下篇我们说说,不同分词器出现的结果有何不同,届时可能着重英文单词,中文分词简单文本,因为复杂文本靠着内置的分词器,觉得好难得到理想结果啊;

慢慢来,理清了概念,一切都会水到渠成的