MongoDB $ text搜索如何工作?

Sus*_*t K 4 mongoose mongodb node.js mongodb-query

我在事件集合中插入了以下值

db.events.insert(
   [
     { _id: 1, name: "Amusement Ride", description: "Fun" },
     { _id: 2, name: "Walk in Mangroves", description: "Adventure" },
     { _id: 3, name: "Walking in Cypress", description: "Adventure" },
     { _id: 4, name: "Trek at Tikona", description: "Adventure" },
     { _id: 5, name: "Trekking at Tikona", description: "Adventure" }
   ]
)
Run Code Online (Sandbox Code Playgroud)

我还通过以下方式创建了索引:

db.events.createIndex( { name: "text" } )
Run Code Online (Sandbox Code Playgroud)

现在,当我执行以下查询(搜索-步行)时:

db.events.find({
    '$text': {
        '$search': 'Walk'
    },
})
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

{ _id: 2, name: "Walk in Mangroves", description: "Adventure" },
{ _id: 3, name: "Walking in Cypress", description: "Adventure" }
Run Code Online (Sandbox Code Playgroud)

但是当我搜索Trek时:

db.events.find({
    '$text': {
        '$search': 'Trek'
    },
})
Run Code Online (Sandbox Code Playgroud)

我只有一个结果:

{ _id: 4, name: "Trek at Tikona", description: "Adventure" }
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么它会导致:

{ _id: 4, name: "Trek at Tikona", description: "Adventure" },
{ _id: 5, name: "Trekking at Tikona", description: "Adventure" }
Run Code Online (Sandbox Code Playgroud)

当我搜索步行时,结果显示包含步行和步行的文档。但是,当我搜索“迷航”时,它只会导致包含“迷航”的文档,而该文档本应同时导致“迷航”

Ste*_*nie 6

MongoDB文本搜索使用Snowball词干库根据通用语言规则将单词简化为预期的词根形式(或词干)。算法词干提取可以快速简化操作,但是语言具有会影响准确性的异常(例如不规则或矛盾的动词缀合模式)。该雪球引进包括一些算法所产生的局限性的一个很好的概述。

您的例子walkingwalk和火柴预期。

但是,您的搜索结果示例trekkingtrekk此不匹配trek

您可以通过解释查询并查看parsedTextQuery显示使用的词干搜索词的信息来确认这一点:

db.events.find({$text: {$search: 'Trekking'} }).explain().queryPlanner.winningPlan.parsedTextQuery
{
?   "terms" : [
?       "trekk"
?   ],
?   "negatedTerms" : [ ],
?   "phrases" : [ ],
?   "negatedPhrases" : [ ]
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用在线Snowball演示或通过查找您喜欢的编程语言的Snowball库来检查预期的Snowball词干。

要解决通常可能会影响用例的异常,您可以考虑使用关键字将另一个字段添加到文本索引中以影响搜索结果。在此示例中,您将添加trek为关键字,以使描述为的事件trekking也与搜索结果匹配。

还有其他一些更精确的变形方法,通常称为lemmatization。缩小化算法更为复杂,并开始进入自然语言处理领域。如果要在应用程序中实现更高级的文本搜索,可以使用许多开源(和商业)工具包,但是这些工具包不在MongoDB文本搜索功能的当前范围内。

  • 今天学到了新东西。谢谢。已投票。 (2认同)