MongoDB Atlas搜索-搜索字符串中包含多个带';和';条件(非';或';)

MongoDB Atlas搜索-搜索字符串中包含多个带';和';条件(非';或';),mongodb,search,autocomplete,mongodb-atlas,mongodb-atlas-search,Mongodb,Search,Autocomplete,Mongodb Atlas,Mongodb Atlas Search,在MongoDB Atlas search的文档中,它为运营商提供了以下信息: 查询:要搜索的一个或多个字符串。如果表中有多个术语 一个字符串,Atlas搜索也会为 分开串 对于操作员,同样的情况也适用: 查询:要搜索的一个或多个字符串。如果有多个 在字符串中,Atlas搜索也会查找每个术语的匹配项 分别在字符串中 对我来说,分别匹配每个术语似乎很奇怪。我们需要在我们的应用程序中进行多次搜索,每次搜索的结果越少,输入的单词越多,而不是越多 示例:当搜索“John Doe”时,我只希望结果同时包含

在MongoDB Atlas search的文档中,它为运营商提供了以下信息:

查询:要搜索的一个或多个字符串。如果表中有多个术语 一个字符串,Atlas搜索也会为 分开串

对于操作员,同样的情况也适用:

查询:要搜索的一个或多个字符串。如果有多个 在字符串中,Atlas搜索也会查找每个术语的匹配项 分别在字符串中

对我来说,分别匹配每个术语似乎很奇怪。我们需要在我们的应用程序中进行多次搜索,每次搜索的结果越少,输入的单词越多,而不是越多

示例:当搜索“John Doe”时,我只希望结果同时包含“John”和“Doe”。目前,我得到的结果与“John”或“Doe”匹配

使用MongoDB Atlas搜索是不可能的,还是我做错了什么


更新 目前,我已经通过在空格(“”)上拆分搜索词并将每个单独的关键字添加到一个单独的must子子句(使用复合运算符)来解决这个问题。但是,如果有一个关键字只有一个字符,则搜索查询不再返回任何结果。为了说明这一点,我将具有一个字符的关键字与具有多个字符的关键字分开。 下面的代码段可以工作,但为此,我需要在每个文档上保存两个生成的字段:

  • searchString:所有可搜索字段连接在一起的字符串。F.e.“John Doe Man Street City”
  • searchArray:上面的字符串大写并在空格(“”)上拆分为一个数组
在此集合上创建搜索索引“默认”:

{
  "mappings": {
    "dynamic": false,
    "fields": {
      "searchString": {
        "type": "autocomplete"
      }
    }
  }
}
执行以下查询:

db.getCollection('testing').aggregate([
  {
    $search: {
      autocomplete: {
        query: "John Doe",
        path: 'searchString',
        fuzzy: {
          maxEdits: 1,
          prefixLength: 4,
          maxExpansions: 20,
        },
      },
    },
  },
]).toArray();

当用户搜索“John Doe”时,此查询返回路径“searchString”中包含“John”或“Doe”的所有文档。在本例中,这意味着所有3个文档。用户键入的单词越多,返回的结果就越多。这不是预期的行为。我希望更多的单词匹配更少的结果,因为搜索词变得更精确。

一个
edgeGram
标记化策略可能更适合您的用例,因为它从左到右工作

请尝试使用以下索引定义:


另外,将您的查询子句从must添加到filter。这将排除不包含所有标记的文档。

一个
edgeGram
标记化策略可能更适合您的用例,因为它从左到右工作

请尝试使用以下索引定义:


另外,将您的查询子句从must添加到filter。这将排除不包含所有令牌的文档。

您能分享一个示例查询、结果和示例文档吗?@Nice Guy谢谢您的反应。我已经更新了帖子。这些信息说明了情况吗?这有点帮助。现在,还有两件事会很有帮助,那就是返回的一些示例文档和相应的索引定义。@Nice Guy,我用完整的示例再次更新了它。谢谢你的耐心!好的,太好了!谢谢你的坚持。我已经添加了一个答案。你能分享一个示例查询、结果和示例文档吗?@Nice Guy谢谢你的反应。我已经更新了帖子。这些信息说明了情况吗?这有点帮助。现在,还有两件事会很有帮助,那就是返回的一些示例文档和相应的索引定义。@Nice Guy,我用完整的示例再次更新了它。谢谢你的耐心!好的,太好了!谢谢你的坚持。我添加了一个答案。谢谢你的建议。我已经将索引更改为您的示例,当我对“John Doe”运行相同的搜索查询时,它仍然与3个文档匹配。所以它仍然与“John”或“Doe”匹配。@Lowie我又添加了一位,您应该将必须更改为过滤器。你能试试吗?我还将设置你的索引并测试它,确保我的建议有效。备用物品我明天会发。谢谢你的建议。我已经将索引更改为您的示例,当我对“John Doe”运行相同的搜索查询时,它仍然与3个文档匹配。所以它仍然与“John”或“Doe”匹配。@Lowie我又添加了一位,您应该将必须更改为过滤器。你能试试吗?我还将设置你的索引并测试它,确保我的建议有效。备用物品我明天发。
{
  "mappings": {
    "dynamic": false,
    "fields": {
      "searchString": {
        "type": "autocomplete"
      }
    }
  }
}
db.getCollection('testing').aggregate([
  {
    $search: {
      autocomplete: {
        query: "John Doe",
        path: 'searchString',
        fuzzy: {
          maxEdits: 1,
          prefixLength: 4,
          maxExpansions: 20,
        },
      },
    },
  },
]).toArray();
{
  "mappings": {
    "dynamic": false,
    "fields": {
      "searchString": [
        {
          "type": "autocomplete",
          "tokenization": "edgeGram",
          "minGrams": 3,
          "maxGrams": 10,
          "foldDiacritics": true
        }
      ]
    }
  }
}