我正在使用 $match 和 $regex、$in、$eq、$size、$gte 等运算符通过hard数据(数字、其他值)搜索集合。
{'$match': {'$and': [{'isbn': {'$exists': 1}}, {'form': {'$in': ['BC']}}]}}
使用 $facet,我可以计算找到的匹配项。
出于其他目的,我使用 $search 索引进行漂亮的文本搜索。我得到分数、突出显示和批次,并且再次(但不是通过 $facet)找到找到的匹配项的count。
$search': {
'index': 'default',
'compound': {
'must': [
how...
],
},
'count': {'type': 'total'},
}
我可以结合 $match 和 $search,但无法获得正确的计数。 $search 不能与 $facet 结合使用,如果没有 $facet,文本搜索始终会计算文本搜索找到的内容,而不考虑不匹配的文档。
如何将两者结合起来?在 Atlas 的文本搜索中添加复合过滤器或使用有限数量的运算符是不够的。
底线,这都是关于正确的结果计数。
谢谢。
简短的回答是你不能。
$search
阶段使用完全不同的索引和方法来“匹配”文档,因此存在限制,它必须是管道中的第一步,并且不能嵌套在$facet
中。
消除这些限制基本上只会运行 2 个查询,这是您必须做的。
const count = await collection.aggregate([...matchStage, ...countStage])
const highlights = await collection.aggregate([...searchStage, ...matchStage])
ElasticSearch 中可能的方法是使用 children 管道,但据我所知,这在图集搜索上尚不可用。