一、什么是倒排索引?有什么好处?
正排索引:书本的目录
倒排索引:书本的索引
图书和搜索引擎的对比
图书:
正牌索引-目录页
倒排索引-索引页
搜索引擎:
正排索引-文档Id到文档内容和单词的关联
倒排索引-单词到文档Id的关系
倒排索引的核心组成
倒排索引包含两个部分:
(1)单词词典,记录所有文档的单词,记录单词到倒排列表的关联关系
(2)倒排列表(Posting List)- 记录了单词对应的文档结合,由倒排索引项组成
倒排索引项:
> 文档ID
> 词频TF -该单词在文档中出现的次数,用于相关性评分
> 位置 Postion - 单词在文档中分词的位置,用于语句搜索 (phrase query)
> 偏移 Offset-记录单词的开始结束位置,实现高亮显示
如:
ES 的倒排索引
(1)ES 的JSON 文档中的每个字段,都有自己的倒排索引
(2)可以指定对某些字段不做索引
> 优点:节省存储空间
> 缺点:字段无法被搜索
二、ES了解多少?说说你们公司的ES集群架构?
ES: 是一个基于Lucene框架的搜索引擎产品,提供了Restful风格的操作接口。
Lucene:是一个非常高效的全文检索引擎框架。
ES的一些核心概念:
索引 index --> table
文档 document --> row
字段 field text\keyword\byte --> 列
映射Mapping --> Schema
查询方式 DSL --> SQL
ES优点:
1、elasticsearch是一个基于Lucene的高扩展的分布式搜索服务器,支持开箱即用。
2、elasticsearch隐藏了Lucene的复杂性,对外提供Restful 接口来操作索引、搜索。
3、支持分布式,扩展性好,可部署上百台服务器集群,处理PB级数据。
4、近实时的获取索引数据、搜索数据。
5、降低全文检索的学习曲线,可以被任何编程语言调用。
ES集群架构:
三、如何进行中文分词?用过哪些分词器?
1、Analyzer 的组成
> Character Filters : 针对原始文本进行处理,如:去除html
> Tokenizer : 按照规则切分为单词
> Token Filter :将切分的单词进行加工、大小写转化、增加同义词
2、ES 内置分词器
> Standard Analyzer - 默认分词器,按词切分,小写处理
> Simple Analyzer - 按照非字母切分,非字母的都被去除,小写处理
> Stop Analyzer - 停用词过滤,小写处理,如:the, a, is
> Whitespace Analyzer - 按照空格切分,不转小写
> Keyword Analyzer - 不分词,直接将输出当作term输出
> Patter Analyzer - 正则表达式分词
> Language - 提供30多种常见语言的分词器
> Customer Analyzer - 自定义分词器
3、中文分词的难点
> 中文句子,切分成一个一个词,而不是一个一个字
> 英文中,单词有自热的空格作为分隔
> 一句中文,在不同的上下文,有不同的理解
如:这个苹果,不大好吃 / 这个苹果,不大,好吃!
4、其他中文分词插件
> ICU Analyzer
> IK Analyzer
5、查看分词粒度
http://172.31.100.175:9200/ingredients_es_index/_analyze/
四、ES写入数据的工作原理是什么?
1、客户端发写数据的请求时,可以发往任意节点。这个节点就会成为coordinating node协调节点。
2、计算的点文档要写入的分片:计算时就采用hash取模的方式来计算。
3、协调节点就会进行路由,将请求转发给对应的primary sharding所在的datanode。
4、datanode节点上的primary sharding处理请求,写入数据到索引库,并且将数据同步到对应的replica sharding
5、等primary sharding 和 replica sharding都保存好文档了之后,返回客户端响应。
五、ES查询数据的工作原理是什么?
1、客户端发请求可发给任意节点,这个节点就成为协调节点。
2、协调节点将查询请求广播到每一个数据节点,这些数据节点的分片就会处理改查询请求。
3、每个分片进行数据查询,将符合条件的数据放在一个队列当中,并将这些数据的文档ID、节点信息、分片信息都返回给协调节点。
4、由协调节点将所有的结果进行汇总,并排序。
5、协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据整合返回给客户端。
六、ES部署时,要如何进行优化?
1)集群部署优化
调整ES的一些重要参数。path.data目录尽量使用SSD。定时JVM堆内存大小。 关于ES的参数,大部分情况下是不需要调优的,如果有性能问题,最好的办法是安排更合理的sharding布局并且增加节点数量。
2)更合理的sharding布局
让sharding和对应的replica sharding尽量在同一个机房。
3)Linux服务器上的一些优化策略
不要用root用户;修改虚拟内存大小;修改普通用户可以创建的最大线程数。
ES生态: ELK日志收集解决方案- filebeat(读log日志)-> logstash -> ElasticSearch -> kibana、Grafana、自研的报表平台。