MongoDB - 查找多个字段中所有匹配搜索字符串的单词

4

我将尝试在多个字段中查找搜索字符串中的所有单词。例如:

如果我在以下数据中搜索 "java coffee":

 { _id: 1, name: "Java Hut", description: "Coffee and cakes" },
 { _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },
 { _id: 3, name: "Coffee Shop", description: "Just coffee" },
 { _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" },
 { _id: 5, name: "Java Shopping", description: "Indonesian goods Hut" },
 { _id: 6, name: "Java Coffee", description: "goods Hut" },
 { _id: 7, name: "Coffee Shop", description: "Just coffee Java" }

我希望它能在每个字段中分别搜索每个单词,并返回所有包含任何指定字段中每个搜索词的文档。

应该会得到id为1、6和7的结果,因为它们匹配了以下内容:

{ _id: 1, name: "**Java** Hut", description: "**Coffee** and cakes" },<br>
{ _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },<br>
{ _id: 3, name: "Coffee Shop", description: "Just coffee" },<br>
{ _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" },<br>
{ _id: 5, name: "Java Shopping", description: "Indonesian goods Hut" },<br>
{ _id: 6, name: "**Java Coffee**", description: "goods Hut" },<br>
{ _id: 7, name: "Coffee Shop", description: "Just **coffee Java**" }

有什么好的想法可以让Mongo以高效的方式执行这个任务吗?
2个回答

7

您可以在集合中添加一个文本索引以启用多个字段的文本搜索。在这种情况下:

db.test.createIndex({name: 'text', description: 'text'})

接着,要查找所有字段中同时包含"java"和"coffee"的文档,你可以执行一个文本搜索查询,并将两个词语用引号括起来以要求同时找到这两个词。将这些词语加引号会将它们变成短语,从而实现逻辑“与”操作,而不是“或”操作。

db.test.find({$text: {$search: '"java" "coffee"'}})

谢谢,这对我很有用。即使其中一个单词是部分匹配的,比如说“jav”而不是“java”,它也能正常工作。你知道是否有办法让它支持多个部分匹配的单词吗? - Kendall
我不会指望部分单词在文本搜索中可靠地工作,因为它使用的是词干处理而不是部分匹配。 - JohnnyHK

1
如果搜索字符串是由空格分隔的字符串,则$text运算符对每个术语执行逻辑OR搜索,并返回包含任何术语的文档。
 db.collection.find( { $text: { $search: "java coffee" } } )

查询将返回该集合中任何文档中是否存在咖啡或Java。请参见 手册 以获取详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接