MongoDB Atlas搜索-搜索字符串中包含多个带';和';条件(非';或';)
在MongoDB Atlas search的文档中,它为运营商提供了以下信息: 查询:要搜索的一个或多个字符串。如果表中有多个术语 一个字符串,Atlas搜索也会为 分开串 对于操作员,同样的情况也适用: 查询:要搜索的一个或多个字符串。如果有多个 在字符串中,Atlas搜索也会查找每个术语的匹配项 分别在字符串中 对我来说,分别匹配每个术语似乎很奇怪。我们需要在我们的应用程序中进行多次搜索,每次搜索的结果越少,输入的单词越多,而不是越多 示例:当搜索“John Doe”时,我只希望结果同时包含“John”和“Doe”。目前,我得到的结果与“John”或“Doe”匹配 使用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”时,我只希望结果同时包含
更新 目前,我已经通过在空格(“”)上拆分搜索词并将每个单独的关键字添加到一个单独的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
}
]
}
}
}