我正在尝试使用MongoDB的全文搜索功能并观察一些意外行为。这个问题与" stemming"文本索引功能的一个方面。全文搜索的方式在网上很多文章中有描述,如果你有一个字符串"大猎犬"在作为文本索引一部分的文档字段中,您应该能够搜索" hunt"或者"狩猎"以及" dog"或者"狗"。 MongoDB应该在索引时以及搜索时规范化或阻止文本。所以在我的例子中,我希望它可以保存单词" dog"和"打猎"在索引中搜索这个单词的词干版本。如果我搜索" hunting",MongoDB应该搜索" hunt"。
嗯,这不是我的工作方式。我在Linux上运行MongoDB 2.4.8并启用了全文搜索。如果我的记录有价值"大猎犬",只搜索"大"将产生结果,同时搜索" hunt"或"狗"什么都不产生就好像那些不在其标准化中的单词"表单不存储在索引文本中(或以某种方式存储它找不到它们)。使用$ regex运算符的搜索工作正常,也就是说,我可以通过搜索字符串来查找文档,例如/ hunting /针对相关字段。
我尝试删除并重新创建全文索引 - 没有任何改变。我只能找到包含" normal"形成。搜索像#34;狗等#34;或者"狩猎" (甚至"狗"或"狩猎")不会产生任何结果。
我是否误解或滥用全文搜索操作或MongoDB中是否存在错误?
答案 0 :(得分:3)
经过大量的实验和挠头后,我发现了这种行为的原因。事实证明,该集合中的文档具有属性“语言”。显然,该属性的存在和价值使这些文档不可搜索。 (该值恰好是'ENG'。将其更改为'eng'可能会使该文档再次被搜索。但是,该字段用于完全不同的目的)。在我将字段重命名为“lang”之后,我通过搜索“dog”或“dog”找到了包含“dogs”字样的文档。
我想知道这是否是MongoDB的预期行为 - 文档中语言属性的存在会影响文本搜索。
答案 1 :(得分:0)
“语言”字段(如果存在)允许每个文档覆盖
可以完成词汇的语言。我认为,作为
你为MongoDB指定了一个它无法识别的语言(“ENG”),
根本无法阻止这些话。正如其他人指出的那样,你可以使用
language_override
选项指定MongoDB应该使用某些
用于此目的的其他字段(例如“lang”)而不是默认字段(“语言”)。
下面是一个很好的引用(关于全文索引和搜索) 与您的问题完全相关。它取自本书。
“MongoDB:权威指南,第2版”
使用其他语言搜索
当插入文档(或首次创建索引)时,MongoDB会查看 索引字段和每个单词的词干,将其减少为必要单位。但是,不同 语言以不同的方式干涉单词,因此必须指定索引的语言 或者文件是。因此,文本类型索引允许使用“default_language”选项 指定,默认为“英语”,但可以设置为许多其他语言 (有关最新列表,请参阅联机文档)。 例如,要创建法语索引,我们可以说:
> db.users.ensureIndex({"profil" : "text", "interets" : "text"}, {"default_language" : "french"})
除非另有说明,否则法语将用于词干。你可以,在 在每个文档的基础上,通过具有“语言”字段来指定另一种词干语言 它描述了文档的语言:
> db.users.insert({"username" : "swedishChef", "profile" : "Bork de bork", language : "swedish"})
这本书没有提及(至少这一页没有)是
可以使用language_override
选项指定MongoDB
应该为此目的使用其他一些领域(比如“lang”)和
不是默认的(“语言”)。
答案 2 :(得分:0)
在http://docs.mongodb.org/manual/tutorial/specify-language-for-text-index/中,在设置索引时,请查看 language_override 选项。它允许您更改应该用于定义文本搜索语言的字段的名称。那样你就可以离开"语言"应用程序的使用属性,并将其称为其他内容(例如searchlang或类似内容)。