我正在使用ElasticSearch 6.5在几个索引中进行搜索。 我将尝试解释这种情况:我有一个多租户应用程序,客户可以在其中搜索产品。有共享的产品和租户的产品。
我将共享产品保存在单独的只读索引A中,它们大约为2百万。每个租户在索引B中都有自己的“自有空间”,可以在其中添加自己的产品。
租户可以在自己的索引中复制共享产品。在搜索期间,我需要过滤两个索引(A和B)中的数据,以删除重复项,但索引B的优先级应高于索引A =>这意味着,如果将产品从索引A复制到索引B,则在搜索过程中会显示B版本。换句话说,产品的B版本必须“替代” A版本。
现在,我正在使用ES过滤器(https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html),因为我不需要分数并且搜索准确无误,并且我希望得到斋戒的答复。过滤器也被缓存,从而改善了我的应用程序中的用户体验。
我知道我可以通过这种方式对多个索引使用重复数据删除:
POST http://myElastic.com/test/e1,e2,e3/_search
{
"aggs":{
"dedup" : {
"terms":{
"field": "id"
},
"aggs":{
"dedup_docs":{
"top_hits":{
"size":1
}
}
}
}
}
}
我想知道如何优先使用继续使用过滤器而不是查询(具有分数)的索引B。 此外,我想知道在这种情况下分页和排序是否正常工作,在这种情况下,ES必须合并来自多个索引的不平衡数据(在索引A中我拥有200万个产品,在索引B中我拥有A产品的一部分应覆盖它们,加上租户的定制产品。