我有一个包含不同目录产品的搜索索引。现在,当我搜索给定的搜索词时,通常会返回如下结果:
Catalog 1 - Product 1
Catalog 1 - Product 2
Catalog 1 - Product 3
...
Catalog 1 - Product x
Catalog 2 - Product 1
...
这不是最佳的,因为我想将用户指向其他目录,同时,也不需要他浏览包含同一目录的所有产品的多个搜索结果页面。所以我尝试使用多元化的采样器聚合,它与一个孩子一起使用top_hits-aggregation似乎正是我想要的解决方案:
POST /myIndex/_search?typed_keys=true
{
"query": {
"query_string": {
"fields": [
"title^2",
"description^2",
"descriptionOriginal^0.01"
],
"query": "*someSearchTerm*"
}
},
"size": 0,
"aggs": {
"aggDiversifiedSampler": {
"diversified_sampler": {
"shard_size": 100000,
"field": "catalogId",
"max_docs_per_value": 3
},
"aggs": {
"aggTopHits": {
"top_hits": {
"from": 0,
"size": 50,
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
}
}
}
}
}
分页是通过内部 top_hits-aggregation 的“size”和“from”属性完成的。可以从内部 top_hits-aggregation 的值集合中获取搜索结果 - 因此我将查询本身的大小设置为 0。
这似乎有效 - 乍一看,但仔细查看结果会发现,并非所有搜索结果都被返回。结果现在看起来像这样:
Catalog 1 - Product 1
Catalog 1 - Product 2
Catalog 1 - Product 3
Catalog 2 - Product 1
Catalog 2 - Product 2
Catalog 2 - Product 3
...
Catalog x - Product 1
Catalog x - Product 2
Catalog x - Product 3
……然后就结束了。
看起来,diversively_sampler 在到达最后一个目录后不会扭曲,因此不会出现来自单个目录的进一步结果。我想要的是这样的:
Catalog 1 - Product 1
Catalog 1 - Product 2
Catalog 1 - Product 3
Catalog 2 - Product 1
Catalog 2 - Product 2
Catalog 2 - Product 3
...
Catalog x - Product 1
Catalog x - Product 2
Catalog x - Product 3
Catalog 1 - Product 4
Catalog 1 - Product 5
Catalog 1 - Product 6
Catalog 2 - Product 4
Catalog 2 - Product 5
Catalog 2 - Product 6
...
有任何想法吗?我使用多元化采样器的技术并没有一成不变,但我想不出别的办法。也许是一些花哨的基于脚本的查询排序?不知道。基于客户端的重新排序不是一种选择,因为我不希望弹性搜索方式的分页被破坏。我需要分页来保持性能 - 搜索索引约为 18GB,包含 900k 文档......