我们指挥平台上有一个功能叫智能搜索
输入关键字可以搜索各个业务,这里的搜索是通过es实现的,大概分为3个步骤:业务数据到事实表,这个过程在这一篇有说到,事实表到es,按类型查询。我们架构同事都是采用输入流、输出流的思想,识别什么是输入流,什么是输出流,也就是什么是数据来源,什么是结果数据。
输入流 input 输入流需要定义数据如何查询
输出流 output 输出流需要定义数据如何写入
分别说下这几个步骤
1.业务数据到事实表
这里不再赘述,上面说到了。
2.事实表到es
大致的过程就是查询这些要搜索的业务的事实表,整合这些字段信息,包括id,文本信息等,建立es对应的索引结构,然后把数据批量写入。流程大概是这样的
2.1 查询对应事实表为input输入
查询形如
2.2 构建es索引结构 这里其实会遇到比较多的问题,比如类型问题
索引内容大概是这样
2.3 向es写入
通过es api 批量写入
3.按类型查询
定义了抽象方法让各业务实现,各业务需指明类型,主要有查询build构建,高亮build构建
获取分组搜索结果 type默认是0,1
SearchServiceImpl.doGroupedSearchYiChun->
添加MultiSearchRequestBuilder->
ElasticsearchClient.execute->
saveResponseToResult
我们使用_msearch 查询
must指定了所有查询必须为 true 时将匹配到文档
以上就是大概的过程
为什么要这么设计?
一方面是因为搜索是走的es,es的数据必须来源于业务,如果采用业务主动触发的方式可能会使得代码逐渐臃肿,如果要稍微修改,还要发布业务服务;另外一点是说跟业务绑定的话,如果搜索出了问题,不太好排查,可能前置路径太多。解决了业务数据到es,再说查询的设计,由于不同业务的信息可能不一致,为此抽象出一个接口,让所有业务实现对应的查询逻辑,主要是字段名的设置,后面可能还会做更多的处理。
希望在以后的工作中能逐渐实践并应用。