一、单索引库查询效率降低的问题
爬虫程序每天都会到互联网上采集新的文章数据,如果项目运行了半年、1年,所有的数据都存储到ES的一个索引库里面,这样会导致查询效率降低。
可以考虑按周或者按月创建索引库,通过索引库别名关联最近半年内的索引库,实现默认查询最近半年内的数据。
索引库的命名可以按照一定的规律,假设是按月建立索引库,则索引库的名称大致是这样的:
article_202201
article_202202
article_202203
…
如果确实需要查询历史以来所有的数据,在查询的时候可以通过索引库通配符实现所有数据查询,使用这个索引库通配符即可:article_*,这样可以查询所有以article_开头的索引库。
类似于百度这样,提供一个高级搜索选项,在里面进行一些个性化高级设置。
二、自定义词库导致的历史数据查询异常问题
当项目运行了一段时间以后,需要在自定义词库中新增一些词语,但是这个新增的词语只会针对后续新增的索引数据生效,对之前的索引数据是不生效的。
针对之前的历史数据根据新增的词语进行查询,可能还是查不出来结果,这属于正常现象。
如果想要实现新增的自定义词语在历史数据中可以查询出来数据,只有一个办法,就是重建索引,这个工作量就有点大了,所以一般情况下也不需要针对历史数据额外处理,知道有这个现象就行了。
三、ES和HBase数据一致性问题
针对这个问题,可以分析一下ES和HBase数据同步的三种方案,每种方案的优缺点。
详细分析见第2章《ES和HBase数据同步的三种方案》小节
四、针对这个项目能不能只用ES?
Elasticsearch最擅长的是快速复杂查询,虽然它支持分布式,也可以存储海量数据,但是这并不是它最擅长的功能,因为数据存储多了之后肯定会影响ES的性能,所以需要引入HBase实现海量数据存储,在ES中主要维护查询需要用到的字段。
五、ES和HBase中存储的数据有什么区别?
可以详细分析一下ES中的mapping设计,重点分析文章的正文(content)字段。
正文字段只需要在HBase中存储,不需要在ES中存储,但是需要在ES中建立索引,因为在查询的时候需要根据这个字段进行查询。
详细解释见第4章内容。