通过MongoDB Atlas增强您的搜索功能:高级查询技术
#教程 #database #nosql #mongodb

欢迎回到我们关于MongoDB Atlas全文搜索的博客系列的第二部分。在第一部分,“ From Indexing to Querying: How MongoDB's Full-Text Search Stacks Up Against Elasticsearch”,我们探索了MongoDB的全文搜索的基本原理,并将其与Elasticsearch进行了比较。如果您还没有阅读,我们强烈建议从那里开始,以便对MongoDB的全文搜索功能有全面的了解。在这篇博客文章中,我们将更深入地研究MongoDB Atlas全文搜索并探索高级查询技术,这将使您充分利用其强大的功能。

了解复合查询。

复合查询在现实世界中的用例中非常重要和强大。
MongoDB中的复合操作员结合了多个操作员以形成单个查询。化合物查询的每个部分都称为子句,每个子句包含一个或多个子语句。

复合查询具有以下语法

{
  $search: {
    "index": <index name>, // optional, defaults to "default"
    "compound": {
      <must | mustNot | should | filter>: [ { <clauses> } ],
      "score": <options>
    }
  }
}

解释

每个都必须(Mustnot),应该和过滤子句包含一系列子句。即使数组仅包含一个子段。

,也使用数组语法。

我们需要以下术语来构建查询,我们也在上面解释了 -

文档用于解释所有查询 -

{
  "_id" : 1,
  "type" : "apple",
  "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
  "category" : "nonorganic",
  "in_stock" : false
},
{
  "_id" : 2,
  "type" : "banana",
  "description" : "Bananas are usually sold in bunches of five or six.",
  "category" : "nonorganic",
  "in_stock" : true
},
{
  "_id" : 3,
  "type" : "pear",
  "description" : "Bosc and Bartlett are the most common varieties of pears.",
  "category" : "organic",
  "in_stock" : true
}

操作员 -

  • 必须 必须在结果中包含文档的条款。返回的分数是该子句中所有子查询的分数的总和。

映射到布尔运算符。

示例:

db.col.aggregate([
  {
    $search: {
      "compound": {
        "must": [{
          "text": {
            "query": "varieties",
            "path": "description"
          }
        }]
      }
    }
  }
])

解释

在上面的查询中,我们正在搜索字段中的Varieties术语description中,该字段在查询中称为path,此查询将仅返回包含此的文档-Varieties术语-descriptiondescription

  • Mustnot 必须在结果中包含文档的条款。 Mustnot条款不为返回的文档的分数做出贡献。

映射到布尔运算符,而不是布尔操作员。

示例:

db.col.aggregate([
  {
    $search: {
      "compound": {
        "mustNot": [{
          "text": {
            "query": "apples",
            "path": "description"
          }
        }]
      }
    }
  }
])

解释

在上述查询中,我们正在搜索字段描述中不包含苹果的数据,因此此查询将仅返回字段描述中没有苹果的那些文档。

  • 应该 您希望在结果中包含的文档中匹配的条款。包含匹配的文档应为子句的分数高于不包含应有条款的文档。返回的分数是该子句中所有子查询的分数的总和。

如果您使用多个应该的子句,则可以使用最小值选项来指定必须匹配的最小数量的应匹配以在结果中包含文档的条款。如果省略,最小值选项默认为0。

映射到或布尔运算符。

示例:

db.col.aggregate([
  {
    $search: {
      "compound": {
        "Should": [{
          "text": {
            "query": "apples",
            "path": "description"
          }
        }]
      }
    }
  }
])

解释

在上述查询中,我们正在搜索字段描述中包含苹果的数据,因此此查询将返回字段描述中包含苹果的文档。

为了更好地理解这一点,应该是操作员,这也是一个或操作员,这是第二个示例 -

db.col.aggregate([
  {
    $search: {
      "compound": {
        "Should": [{
          "text": {
            "query": "apples",
            "path": "description"
          },
          "text": {
            "query": "Banana",
            "path": "description"
          }
        }],
          "minimumShouldMatch": 1
      }
    }
  }
])

解释

在上面的查询中,我们正在搜索字段中包含applesBanana的数据,因此该query将返回那些在field description中带有苹果或香蕉的文档查询,minimumShouldMatch表示必须指定必须匹配的最少数量的应匹配以在结果中包含文档的条款(给定期限必须发生特定时间,无论我们以参数作为参数,default是0)

  • 过滤 条款必须匹配结果中的文档。过滤条款不为返回的文档的分数做出贡献。

换句话说,它是全文搜索中运算符的$替代。

过滤器的行为与必须相同,除了返回文档的分数未考虑过滤器子句,因此不会影响返回文档的顺序。

示例:

$search: {
  "compound": {
    "filter": [{
      "text": {
        "query": ["CLIENT", "PROFESSIONAL"],
        "path": "role"
      }
    }]
  }
}

现在,据我们了解全文搜索的所有重要操作员,这里是查询的一个示例,它结合了所有这些操作员以获得结果。

查询 -

db.col.aggregate([
  {
    $search: {
      "compound": {
        "must": [{
          "text": {
             "query": "varieties",
             "path": "description"
          }
        }], 
        "mustNot": [{
          "text": {
            "query": "apples",
            "path": "description"
          }
        }],
        "should": [
          {
            "text": {
              "query": "Fuji",
              "path": "description"
            }
          },
          {
            "text": {
              "query": "Golden Delicious",
              "path": "description"
            }
          }],
          "minimumShouldMatch": 2
        }
      }
    }
])

说明:

以下示例使用了mustmustNotShouldclauses的组合来构建querymustclauess使用文本运算符将术语search用于描述字段。为了使文档匹配,它必须满足mustcause。 mustNotclauess对descriptionfield的applesapples中执行search。为了使文档匹配,它不得满足mustNotcause。 Should子句使用文本运算符将search用于描述字段中的FujiGolden Delicious。为了使文档至少匹配两次的文档,即我们使用的minimumShouldMatch,它将返回任何条款或两个条款,如果出现超过1个。

我希望您能在深入了解MongoDB Atlas Full Text Search时发现这篇博客文章提供信息和乐于助人。快乐查询!