一、单索引库查询效率降低的问题

爬虫程序每天都会到互联网上采集新的文章数据,如果项目运行了半年、1年,所有的数据都存储到ES的一个索引库里面,这样会导致查询效率降低。

可以考虑按周或者按月创建索引库,通过索引库别名关联最近半年内的索引库,实现默认查询最近半年内的数据。

索引库的命名可以按照一定的规律,假设是按月建立索引库,则索引库的名称大致是这样的:

article_202201
article_202202
article_202203

如果确实需要查询历史以来所有的数据,在查询的时候可以通过索引库通配符实现所有数据查询,使用这个索引库通配符即可:article_*,这样可以查询所有以article_开头的索引库。

类似于百度这样,提供一个高级搜索选项,在里面进行一些个性化高级设置。

hbase模糊查询rowkey hbase模糊匹配_数据


hbase模糊查询rowkey hbase模糊匹配_hbase_02

二、自定义词库导致的历史数据查询异常问题

当项目运行了一段时间以后,需要在自定义词库中新增一些词语,但是这个新增的词语只会针对后续新增的索引数据生效,对之前的索引数据是不生效的。
针对之前的历史数据根据新增的词语进行查询,可能还是查不出来结果,这属于正常现象。

如果想要实现新增的自定义词语在历史数据中可以查询出来数据,只有一个办法,就是重建索引,这个工作量就有点大了,所以一般情况下也不需要针对历史数据额外处理,知道有这个现象就行了。

三、ES和HBase数据一致性问题

针对这个问题,可以分析一下ES和HBase数据同步的三种方案,每种方案的优缺点。
详细分析见第2章《ES和HBase数据同步的三种方案》小节

四、针对这个项目能不能只用ES?

Elasticsearch最擅长的是快速复杂查询,虽然它支持分布式,也可以存储海量数据,但是这并不是它最擅长的功能,因为数据存储多了之后肯定会影响ES的性能,所以需要引入HBase实现海量数据存储,在ES中主要维护查询需要用到的字段。

五、ES和HBase中存储的数据有什么区别?

可以详细分析一下ES中的mapping设计,重点分析文章的正文(content)字段。

hbase模糊查询rowkey hbase模糊匹配_elasticsearch_03


正文字段只需要在HBase中存储,不需要在ES中存储,但是需要在ES中建立索引,因为在查询的时候需要根据这个字段进行查询。

详细解释见第4章内容。