【问题标题】:Stemming does not work properly for MongoDB text index词干对 MongoDB 文本索引不起作用
【发布时间】:2014-05-11 02:41:38
【问题描述】:

我正在尝试使用 MongoDB 的全文搜索功能并观察到一些意外行为。该问题与文本索引功能的“词干”方面有关。网上很多文章都描述了全文搜索的方式,如果你在文档的字段中有一个字符串“大猎狗”是文本索引的一部分,你应该也可以搜索“狩猎”或“狩猎”如“狗”或“狗”。 MongoDB 应该在索引和搜索时规范化或停止文本。因此,在我的示例中,我希望它在索引中保存单词“dog”和“hunt”并搜索这些单词的词干版本。如果我搜索“hunting”,MongoDB 应该搜索“hunt”。

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

我尝试删除并重新创建全文索引 - 没有任何改变。我只能找到包含“正常”表格上的单词的文档。搜索“dogs”或“hunting”(甚至“dog”或“hunt”)之类的词不会产生任何结果。

是我误解或误用了全文搜索操作还是 MongoDB 中存在错误?

【问题讨论】:

  • 您确实阅读了“测试版”的部分,不是。同样的问题也被问到today
  • 尼尔,谢谢你的参考。我也确实看到了您所指的问题。如果你仔细观察,我们的问题就大不相同了。其他问题的作者抱怨说,在词干实现中存在一个微妙的缺陷,这使得 MongoDB 无法识别某些非标准英语复数形式的派生词(如鼠标或标准)。我的抱怨是,即使使用标准复数,词干在我的环境中也根本不起作用。如果我的文档中有“季节”一词,我无法使用全文搜索找到该文档。这个词适用于其他帖子的作者。
  • 您能否提供一个或 2 个示例文档以及您用于创建索引和运行搜索的命令?

标签: mongodb search indexing full-text-search stemming


【解决方案1】:

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

我想知道这是否是 MongoDB 的预期行为 - 文档中语言属性的存在会影响文本搜索。

【讨论】:

    【解决方案2】:

    迈克尔,

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

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

    “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”)和
    不是默认的(“语言”)。

    【讨论】:

      【解决方案3】:

      http://docs.mongodb.org/manual/tutorial/specify-language-for-text-index/ 中查看设置索引时的language_override 选项。它允许您更改用于定义文本搜索语言的字段名称。这样,您可以将“语言”属性留给您的应用程序使用,并将其命名为其他名称(例如 searchlang 或类似名称)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-10
        • 2021-10-13
        • 2018-03-02
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多