【问题标题】:MongoDb fulltext search AND conditionMongoDb全文搜索和条件
【发布时间】:2015-04-09 10:53:54
【问题描述】:

我尝试在 mongodb 中使用文本索引: {$text: {$search: 'sport hockey'}}

使用 OR 条件按短语搜索:'sport' OR 'hockey'。例如,结果可以是以下标题列表:

  • 今天做点运动......
  • 运动就是曲棍球
  • 曲棍球运动员

最相关的文档位于第二个位置(实际上我想排除除此之外的所有其他结果:'Sport is hockey')。 $text中可以使用AND条件吗?

引号不合适,因为{$text: {$search: "\"sport hockey\""}} 使用完全匹配搜索。

【问题讨论】:

    标签: node.js mongodb mongoose full-text-search


    【解决方案1】:

    尝试在您的输出中包含 textScore,然后对其进行排序以获取最相关的文档(可选地使用 limit 来获取前 n 个相关文档)。

    db.your_collection.find(
      {
        $text: { $search: "sport hockey" }
      }, {
        score: { $meta: "textScore" }
      }
    ).sort(
      {
        score: { $meta: "textScore" }
      }
    ).limit(2)
    

    【讨论】:

    • 来自 MongoDB 手册:$text will tokenize the search string using whitespace and most punctuation as delimiters, and perform a logical OR of all such tokens in the search string. 这意味着您的答案使用 OR 而不是 AND,这意味着它没有回答 OP 的问题。
    【解决方案2】:

    文本搜索不提供这种开箱即用的功能。但是有两种可能的解决方法。

    1. 使用 2.6 之前的解决方案进行文本搜索:将文本字段分解为单个单词,并将单个单词作为数组保存在同一文档中。然后,您可以对该数组执行$all 查询。

    2. 对每个单词执行单独的文本搜索,并在应用层生成集合交集。

    【讨论】:

      【解决方案3】:

      用作关注

      db.your_collection.find({$text:{$search:' "sport" "hockey" '}})

      必须包含“text”类型的搜索词!

      【讨论】:

        【解决方案4】:

        对于再次访问此主题的任何人,可以使用以下查找查询来实现所需的“AND”搜索条件

        {$text:{$search:"\"sport\" \"hockey\""}}
        

        注意不同单词的转义方式。

        在节点 js 中,可以执行以下操作来为“AND”条件创建期望搜索文本

        searchText = '"' + userInput.split(" ").join('" "') + '"';
        

        然后

        collectionObj.find({$text:{$search:searchText}})
        

        【讨论】:

          猜你喜欢
          • 2018-11-23
          • 1970-01-01
          • 2014-11-24
          • 2016-02-02
          • 2018-10-26
          • 2013-07-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多