MongoDB language_override文本搜索

时间:2017-01-15 15:26:56

标签: mongodb

我有一个MongoDB数据库,其中包含可能使用不同语言的文档。每个文档都包含一个“语言”字段,用于指示文档的语言。

示例:

{ "content" : "This document is English", "language" : "en" }
{ "content" : "Ce document est français", "language" : "fr" }

但是当我进行搜索时,Mongo似乎没有使用“语言”字段,即使索引显示“language_override”:“language”,它似乎只使用索引的“default_language”。 / p>

我是Mongo的新手,所以我可能只是在做一些完全愚蠢的事情。我尝试过Mongo 2.6.10和3.4.1。

我创建了2个数据库,每个数据库都有一个法语文档,第一个数据库有“default_language”:“english”,第二个数据库使用“default_language”:“fr”。当我将索引的“default_language”指定为英语时,除非我明确指定语言,否则找不到该文档。

> use lang_test_
switched to db lang_test_1
> db.createCollection("docs")
{ "ok" : 1 }
> db.docs.insert({ "content" : "le téléchargement ou le chargement de données.", "language" : "fr" } )
WriteResult({ "nInserted" : 1 })
> db.docs.createIndex({ content : "text" })
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.docs.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "lang_test_1.docs"
    },
    {
        "v" : 1,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "content_text",
        "ns" : "lang_test_1.docs",
        "weights" : {
            "content" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 2
    }
]
> db.docs.find({ $text : { $search: "chargement" }}).count()
0
> db.docs.find({ $text : { $search: "chargement", $language: "fr" }}).count()
1
> db.docs.find({ $text : { $search: "chargement", $language: "en" }}).count()
0
> db.docs.find({ $text : { $search: "chargement", $language: "none" }}).count()
0

现在使用默认语言French

> use lang_test_2
switched to db lang_test_2
> db.createCollection("docs")
{ "ok" : 1 }
> db.docs.insert({ "content" : "le téléchargement ou le chargement de données.", "language" : "fr" } )
WriteResult({ "nInserted" : 1 })
> db.docs.createIndex({ content : "text"}, {default_language: "fr" })
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.docs.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "lang_test_2.docs"
    },
    {
        "v" : 1,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "content_text",
        "ns" : "lang_test_2.docs",
        "default_language" : "fr",
        "weights" : {
            "content" : 1
        },
        "language_override" : "language",
        "textIndexVersion" : 2
    }
]
> db.docs.find({ $text : { $search: "chargement" }}).count()
1
> db.docs.find({ $text : { $search: "chargement", $language : "fr" }}).count()
1
> db.docs.find({ $text : { $search: "chargement", $language : "en" }}).count()
0
> db.docs.find({ $text : { $search: "chargement", $language : "none" }}).count()
0

1 个答案:

答案 0 :(得分:0)

索引中的默认语言是用于在没有语言字段时解析搜索关键字和文档内容的语言。

简而言之,如果要使用默认语言以外的语言进行语法分析,则必须指定搜索关键字的语言,类似于为每个文档指定语言的方式。

因此,在第一种情况下,当您未在搜索关键字中指定语言时,文本将以默认语言(英语)进行解析,文档的内容将以法语解析,因此搜索失败。

现在,当您将该语言添加到搜索关键字时,它将以法语进行解析并找到匹配的记录,因为您搜索的内容也会用法语进行解析。

有关原始资料和更多信息,请参阅此故障单。

https://jira.mongodb.org/browse/SERVER-13238