这是我参与 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 自定义分词器
分词器的主要组成是:
- character filter(字符过滤器):接收原字符流,通过添加、删除或者替换操作改变原字符流。例如:去除文本中的html标签。一个字符过滤器可以有零个或者多个。
- tokenizer:将一整段文本拆分成一个个的词。例如拆分英文,通过空格能将句子拆分成一个个的词,对于中文来说,无法使用这种方式来实现。只能借助优秀的算法工程师了;在一个分词器中,有且只有一个tokenizeer
- token filters:将切分的单词添加、删除或者改变。例如将所有英文单词小写,或者将英文中的停词a,and,the,or删除等,或者添加一些必要的词。在token filters中,不允许将token(分出的词)的position或者offset改变。同时,在一个分词器中,可以有零个或者多个token filters
大概的概念就是这些,下篇我们说说,不同分词器出现的结果有何不同,届时可能着重英文单词,中文分词简单文本,因为复杂文本靠着内置的分词器,觉得好难得到理想结果啊;
慢慢来,理清了概念,一切都会水到渠成的