对于MongoDB文本索引,词干分析无法正常工作

对于MongoDB文本索引,词干分析无法正常工作,mongodb,search,indexing,full-text-search,stemming,Mongodb,Search,Indexing,Full Text Search,Stemming,我试图使用MongoDB的全文搜索功能,并观察到一些意外的行为。问题与文本索引功能的“词干”方面有关。许多在线文章都描述了全文搜索的方式,如果在文本索引的文档字段中有一个字符串“大猎狗”,那么您应该能够搜索“狩猎”或“狩猎”以及“狗”或“狗”。在索引和搜索时,MongoDB应该规范化或阻止文本。所以在我的例子中,我希望它在索引中保存单词“dog”和“hunt”,并搜索这个单词的词干版本。如果我搜索“狩猎”,MongoDB应该搜索“狩猎” 嗯,这不是我的工作方式。我在Linux上运行MongoDB

我试图使用MongoDB的全文搜索功能,并观察到一些意外的行为。问题与文本索引功能的“词干”方面有关。许多在线文章都描述了全文搜索的方式,如果在文本索引的文档字段中有一个字符串“大猎狗”,那么您应该能够搜索“狩猎”或“狩猎”以及“狗”或“狗”。在索引和搜索时,MongoDB应该规范化或阻止文本。所以在我的例子中,我希望它在索引中保存单词“dog”和“hunt”,并搜索这个单词的词干版本。如果我搜索“狩猎”,MongoDB应该搜索“狩猎”

嗯,这不是我的工作方式。我在Linux上运行MongoDB 2.4.8,启用全文搜索。如果我的记录有“大猎狗”的值,则只搜索“大”将产生结果,而搜索“狩猎”或“狗”则不会产生任何结果。这就好像不是“标准化”形式的单词没有存储在文本索引中(或者以它找不到它们的方式存储)。使用$regex运算符进行搜索效果很好,也就是说,我可以通过对相关字段搜索类似于/hunting/的字符串来查找文档

我尝试删除并重新创建全文索引-没有任何更改。我只能找到包含“正常”形式单词的文档。搜索诸如“狗”或“狩猎”(甚至“狗”或“狩猎”)之类的词不会产生任何结果


我是否误解或误用了全文搜索操作,或者MongoDB中是否存在漏洞?

经过大量的实验和挠头,我发现了这种行为的原因。事实证明,该集合中的文档具有“语言”属性。显然,该属性的存在和价值使得这些文档无法搜索。(该值恰好为“ENG”。将其更改为“ENG”可能会使此文档再次可搜索。但是,该字段的用途完全不同)。在我将字段重命名为“lang”后,通过搜索“dog”或“dogs”,我能够找到包含单词“dogs”的文档

我想知道这是否是MongoDB的预期行为——文档中的language属性会影响文本搜索。

Michael

“语言”字段(如果存在)允许每个文档覆盖 用于词干分析的语言。我认为,正如
您向MongoDB指定了一种它无法识别的语言(“ENG”),
它根本无法阻止这些话。正如其他人指出的,您可以使用
language\u覆盖
选项,指定MongoDB应该使用一些
用于此目的的其他字段(如“lang”),而不是默认字段(“语言”)

下面是一个很好的引用(关于全文索引和搜索),它
与你的问题完全相关。它取自这本书

MongoDB:权威指南,第2版

用其他语言搜索

插入文档(或首次创建索引)时,MongoDB会查看 索引字段和每个单词的词干,将其简化为基本单元。然而,不同的是 语言以不同的方式生成单词,因此必须指定索引使用的语言 或文件是。因此,文本类型索引允许使用“default_language”选项 指定,默认为“英语”,但可以设置为许多其他语言 (有关最新列表,请参阅联机文档)。 例如,要创建法语索引,我们可以说:

>db.users.ensureIndex({“profile”:“text”,“interets”:“text”},{“default_语言”:“french”})

除非另有规定,否则法语将用于词干。你可以,在一个 根据文档,通过“语言”字段指定另一种词干语言 描述文档语言的:

>db.users.insert({“username”:“swedishChef”,“profile”:“Bork de Bork”,语言:“瑞典语”})

这本书没有提到(至少这一页没有提到)的是
可以使用
language\u override
选项指定MongoDB
应为此使用其他字段(如“lang”)和

不是默认的(“语言”)

在设置索引时,请查看语言覆盖选项。它允许您更改应用于定义文本搜索语言的字段名称。这样,您就可以将“language”属性留给应用程序使用,并将其称为其他名称(例如searchlang或类似名称)。

您确实阅读了“beta”部分,不是吗。同样的问题也被问到了,尼尔,谢谢你的推荐。我也看到了你指的问题。如果你仔细看,我们的问题就大不相同了。《其他问题》的作者抱怨说,词干实现中存在一个微妙的缺陷,即MongoDB无法识别某些非标准英语复数的派生词(如mice或criteria)。我的抱怨是,即使使用标准复数,词干处理在我的环境中也根本不起作用。如果我的文档中有单词“seasons”,则无法使用全文搜索找到该文档。对于另一篇文章的作者来说,这个词很好用。你能提供一个示例文档或2以及你用来创建索引和运行搜索的命令吗?