我发现最近已经慢慢喜欢上了这种状态。啥事不干,看看书,看看视频 然后去面试跟面试官吹牛皮。但是大部分时间都是被吊打。。
今天又面了两家 ,一家是互联网主要做电信bbs的。还有一家是国家电网的。。
今天先复盘一下电信bbs的吧。问了挺多的东西,很多都不会 - -,终究还是太菜了。
在这里忠告各位小伙伴平时要多积累。多学习。不吃学习的苦,就要吃生活的苦ε=(´ο`*)))唉。
1、 我看你这上面使用过Elasticsearch介绍一下你了解的es?
es是一个使用java语言编写的并且基于Lucene编写的搜索引擎, 他提供了分布式的全文搜索服务, 还提供了一个RESTful风格的web接口。
2、es的一些基本构成是什么样的?
es主要是由 索引、类型、文档组成其中
1>index:索引(类似于数据库里面的database)
索引是含有相同属性的文档集合
索引在es中是通过一个名字来识别的, 必须是英文字母小写。
2>type:类型(相当于数据库里面的table)
一个索引可以定义一个或多个类型, 文档必须属于一个类型
3>document:文档(相当于数据库里面的rows)
文档是可以被索引的基本数据单位
4>field:领域(相当于数据库里面的column)
5>分片
每个索引都有多个分片, 每个分片都是一个luncene索引
2.你刚才说到了分片,你详细介绍一下分片是什么以及es是怎么分片的,它的好处是什么?
概念:简单来讲就是咱们在ES中所有数据的文件块,也就是数据的最小单元块,整个ES集群的核心就是对所有分片的分布、索引、负载、路由。
假设 IndexA 有2个分片,我们向 IndexA 中插入10条数据 (10个文档),那么这10条数据会尽可能平均的分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。
设置:创建 IndexName 索引时候,在 Mapping 中可以如下设置分片 (curl)
PUT indexName
{
"settings": {
"number_of_shards": 5
}
}
分片个数计算:
建议:(仅参考)
1、每一个分片数据文件小于30GB
2、每一个索引中的一个分片对应一个节点
3、节点数大于等于分片数
如果 IndexA 所有数据文件大小是300G,根据建议,至少需要 10 个分片。
优点:分摊索引的搜索压力, 提高搜索效率。
3.es的template使用了解吗,讲一下它的基本使用。
用的是ElasticSearchTemplate,建一个实体类里面加一个@document注解类似这样
//indexName:索引名称 type:类型名称 shards :分片 replicas:副本 refreshInterval :刷新间隔
@Document(indexName = "megacorp",type = "employee", shards = 1,replicas = 0, refreshInterval = "-1")
继承一个ElasticsearchRepository接口类似这样:
public interface EmployeeRepository extends ElasticsearchRepository<Employee,String>{
}
然后在service层保存
//注入EmployeeRespository 对象
@Resource
private EmployeeRespository emResp;
//es保存 java对象
emResp.save(new Employee().setName("xxx"));
最后在controller层调用
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
/**
* term匹配
*/
@RequestMapping("/getTerm")
public Object getTerm(Integer employId, @PageableDefault Pageable pageable) {
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("employId", employId)).withPageable(pageable).build();
return elasticsearchTemplate.queryForList(searchQuery, Post.class);
}
具体api调用参考https://tianyalei.blog.csdn.net/article/details/77965257
4、es的备份了解吗?怎么去设置?
4.1 首先在"/usr/local/backups/es_backup"目录下创建一个名为es_backup的仓库
curl -XPUT http://192.168.43.125:9200/_snapshot/es_backup
{
"type": "fs",
"settings": {
"location": "/usr/local/backups/es_backup"
}
}
4.2 备份索引
curl -XPUT http://192.168.43.125:9200/_snapshot/es_backup/snapshot_1
4.3 恢复备份
curl -XPOST http://192.168.43.125:9200/_snapshot/es_backup/snapshot_1/_restore
5. es的倒排索引了解吗?讲一下它的实现。
我的天这个面试官抓着这个es不放了。。
倒排索引也叫反向索引,意思是通过value寻找key,相反 正向索引是通过key找value。
再解释倒排索引的时候我们先了解一下文档矩阵和倒排索引的构成。
5.1文档矩阵
单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系
搜索引擎的索引其实就是实现“单词-文档矩阵”的具体数据结构。而倒排索引就是其最好的实现方式
5.2 倒排索引组成
倒排索引= 单词词典+倒排列表+倒排文件
单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
//假设es有这么几条数据如下
docid content
1 java开发
2 java开发工程师
3 java工程师
//es建立的索引如下
//docid是上面的文档id tf是在当前文档出现的次数 pos是位置
单词id 单词 文档频率 倒排列表(docid;Tf:<pos>)
1 java 3 (1;1;<1>),(2;1;<1>),(3;1;<1>)
2 开发 2 (1;1;<1>),(2;1;<2>)
3 工程师 2 (2;1;<3>),(3;1;<2>)
比如用户输入查询“开发”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息即可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,