Elasticsearch做搜索的场景

168 阅读3分钟

Elasticsearch在下文简称ES。

一般情况下,我们通过查询关系型数据库,来获取数据,这是属于正排索引的方式进行搜索。

但是存在一种情况,即是我们需要对一些文章中的关键词或者词语进行搜索,命中以后返回这条数据。

或许我们可以想象通过数据库的模糊查询等来匹配,或者相关函数来匹配。

这种方式存在的问题有:

一个是分词的问题,比如我想通过一句话来搜索匹配包含这句话的、或者包含这句话中的几个关键词的文章,那这时候就没办法通过数据库的SQL查询来实现了。

另一个是性能的问题,数据库的模糊查询或者执行函数来匹配,都存在比较大的性能问题,尤其是在请求很多的情况下。

所以,针对这种情况,我们可以通过专门的搜索引擎来实现。也即是通过倒排索引来实现分词检索。

我们可以将文章进行分词,按照词语等进行分词,将输入的检索关键字也进行分词,然后进行全局“或”匹配。

只要有命中,那就可以返回数据,并且可以分页检索。

除了关键字分词后进行全局检索,也可以加上“与”逻辑,进行关键字精准匹配,关键字精准匹配就不会再分词了,类似数据中的 “=”条件查询。

在进行这些查询的时候,都需要我们建好索引,我们的索引就类似关系型数据库的数据库,索引下有type(类型),这在ES 7.x 以后,一个index 索引只有一个type ,type 就是相同类型的数据,类比关系型数据库的一张表,在接下来就可以定义我们的document了,document 类比关系型数据库表中的一条记录。

除了类似这种文章之类的搜索场景,所有需要搜索的结构化和非结构化文本数据都可以存入ES,比如我们的日志数据,也可以入ES,结合Logstash,和Kibana做成ELK 日志搜索平台。

还有我们有时候需要做一种全局搜索的功能,这时候其实也可以考虑将关系型数据库中的关键字段抽出来,建索引,存入ES。

根据需要,我们可以在数据入数据库的时候直接入ES ,也可以发送MQ消息,异步、削峰填谷式的来入ES,也可以批量全局入ES。

对于关系型数据库中的结构化数据,我们不必把所有数据都入进ES,可以将需要检索的数据入ES ,并且将这条数据的ID保存进ES ,那这样就可以再次通过ID 精确反查数据库表中的整条数据。

总之ES做搜索的场景有很多,合理的使用ES对系统能力的提升帮助很大。