MongoDB Atlas Search - 如何过滤搜索分数

Posted

技术标签:

【中文标题】MongoDB Atlas Search - 如何过滤搜索分数【英文标题】:MongoDB Atlas Search - How to filter search score 【发布时间】:2021-12-26 14:17:38 【问题描述】:

是否有任何基于 searchScore 过滤结果的好方法。例如,我得到了 15000 个结果,我想通过使用 $match 过滤掉结果,保留分数大于 15 的结果。问题是随着结果数量的增加 $match 会响应缓慢

product.aggregate([
  
    '$search': 
      'text': 
        'query': 'harry potter', 
        'path': 'title'
      
    
  , 
    '$project': 
      'score': 
        '$meta': 'searchScore'
      
    
  , 
    '$match': 
      'score': 
        '$gt': 15
      
    
  
])

【问题讨论】:

尝试使用 MongoDB 查看弹性 ***.com/questions/23846971/… 【参考方案1】:

查看compound 并添加带有rangefilter 子句。

product.aggregate([
  
    '$search': 
      'compound':  
       'must' : [ 
          'text':  'query': 'harry potter', 'path': 'title' 
          ],
       'filter' : 
            'range' :  path: "score", gt: 15  
         
      
  , 
    '$project': 
      'score': 
        '$meta': 'searchScore'
      
    
  
  
])

【讨论】:

嘿@Doug,谢谢你的帮助。但它不起作用。当我在复合内使用带有范围的过滤器子句时,它不会返回任何响应。这背后可能有一个原因是它可能没有在项目阶段之前获得分数。【参考方案2】:

你需要的是一个索引。索引是数据库使用的辅助数据结构,用于更快地访问您希望它跟踪的某些数据。

通常,当您运行选择查询时,MongoDB 会执行“集合扫描”,它会扫描集合中的每个文档以查找所需的数据。但是,使用索引,数据库引擎可以跟踪所需数据的位置,并且它需要扫描的文档数量是有限的。默认情况下,_id 上有一个索引,因为数据库需要确保没有其他索引在每次插入或更新时都具有相同的 _id。您可以在集合中的任何字段上创建自己的索引,official docs 中的示例

但是,请注意,创建索引会对插入和更新的性能产生影响,因为它需要在每个插入的新文档上创建索引。此外,创建索引将占用空间,因为除了数据之外还需要存储它们。如果您有足够的 RAM 以适应内存中的整个索引结构,您将获得最佳性能。

【讨论】:

以上是关于MongoDB Atlas Search - 如何过滤搜索分数的主要内容,如果未能解决你的问题,请参考以下文章

如何将atlas mongodb与集群连接

如何将 MongoDB 领域应用程序用户添加到 Atlas 集合?

如何在 mongodb atlas 中创建插入触发器?

MongoDB atlas 成本计算,以及如何节省成本

如何使用 PHP 正确检查 MongoDB Atlas 数据库中的现有数据。我总是知道名字已经存在

使用区块链技术的身份管理应用,MongoDB Stitch & MongoDB Atlas