dav*_*ave 8 mongodb mongodb-query
在我的文章集合中,我有一个文本索引:
{
"v" : 1,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "title_text_abstract_text_body_text",
"ns" : "foo.articles",
"weights" : {
"abstract" : 1,
"body" : 1,
"title" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 2
}
Run Code Online (Sandbox Code Playgroud)
在我的文章集中,我有一个这样的条目:
{
"_id" : ObjectId("5477c28c807a9cd660ccd567"),
"title" : "Hallo Welt!",
"author" : "foo",
"publishDate" : ISODate("2014-11-28T17:00:00Z"),
"language" : "de",
"abstract" : "Mein erster Artikel!",
"body" : "Dieser Artikel ist in deutscher Sprache.",
"__v" : 0
}
Run Code Online (Sandbox Code Playgroud)
(有在实际上不同的价值观abstract和body,为简洁起见让我们假设它的上面)
当我然后尝试搜索这篇文章时:
db.articles.find({$text: {$search: 'Welt'}})
Run Code Online (Sandbox Code Playgroud)
确实找到了.
但是:当我尝试搜索这篇文章时:
db.articles.find({$text: {$search: 'Sprache'}})
Run Code Online (Sandbox Code Playgroud)
我没有结果.但后来经过我改变了language对en或none我得到这篇文章作为用完全相同的查询结果.
我究竟做错了什么?
编辑:根据评论中的要求,这里是导致上述行为的确切命令.应该首先这样做,道歉.
> db.test.drop()
true
> db.test.insert({language: "de", body: "vermutlich", title: "Artikel"})
WriteResult({ "nInserted" : 1 })
> db.test.ensureIndex({body: "text", title: "text"})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.test.find({$text: {$search: 'vermutlich'}})
> db.test.find({$text: {$search: 'Artikel'}})
{ "_id" : ObjectId("54ea86d6c9ec98269e022c67"), "language" : "de", "body" : "vermutlich", "title" : "Artikel" }
> db.version()
2.6.5
Run Code Online (Sandbox Code Playgroud)
我也尝试过再次更改语言:
> db.test.update({}, {$set: {language: "en"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.find({$text: {$search: 'Artikel'}})
{ "_id" : ObjectId("54ea86d6c9ec98269e022c67"), "language" : "en", "body" : "vermutlich", "title" : "Artikel" }
> db.test.find({$text: {$search: 'vermutlich'}})
{ "_id" : ObjectId("54ea86d6c9ec98269e022c67"), "language" : "en", "body" : "vermutlich", "title" : "Artikel" }
Run Code Online (Sandbox Code Playgroud)
编辑: 好的,所以我只是尝试重建这个例子. 但我还添加了一个德语引用,所以这就是我所做的:
> db.test.drop()
true
> db.test.insert({ language: "portuguese", original: "A sorte protege os audazes.", translation: [{ language: "english", quote: "Fortune favors the bold."},{ language: "spanish", quote: "La suerte rotege a los audaces."}]})
WriteResult({ "nInserted" : 1 })
> db.test.insert({ language: "spanish", original: "Nada hay más surrealista que la realidad.", translation:[{language: "english",quote: "There is nothing more surreal than reality."},{language: "french",quote: "Il n'y a rien de plus surréaliste que la réalité."}]})
WriteResult({ "nInserted" : 1 })
> db.test.insert({ original: "is thisdagger which I see before me.", translation: {language: "spanish",quote: "Es este un puñal que veo delante de mí." }})
WriteResult({ "nInserted" : 1 })
> db.test.insert({original: "Die Geister, die ich rief...", language: "german", translation: {language: "english", quote: "The spirits that I've cited..."}})
WriteResult({ "nInserted" : 1 })
> db.test.ensureIndex( { original: "text", "translation.quote": "text" } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试了一些查询:
> db.test.count({$text: {$search: "delante"}})
1
> db.test.count({$text: {$search: "spirits"}})
1
> db.test.count({$text: {$search: "Geister"}})
0
Run Code Online (Sandbox Code Playgroud)
结论:mongoDB不适用于德语?这真令人沮丧
抱歉,我当时很愚蠢。问题很简单:我们正在尝试将搜索文本"vermutlich"与文档文本进行匹配"vermutlich",要正确执行此操作,您需要使用相同的语言规则来解析两者。如果您执行以下操作:
> db.test.drop()
> db.test.insert({ "language" : "de", "body" : "vermutlich", "title" : "Artikel"})
> db.test.ensureIndex({ "$**" : "text" })
> db.test.count({ "$text" : { "$search" : "vermutlich" } })
0
> db.test.count({ "$text" : { "$search" : "vermutlich", "$language" : "de" } })
1
Run Code Online (Sandbox Code Playgroud)
第一个查询搜索文档,该文档由于该language字段而被索引为德语,使用"vermutlich"processed作为英语单词。
您可以设置文本索引的默认语言,以避免$language在每个查询中指定:
> db.test.drop()
> db.test.insert({ "language" : "de", "body" : "vermutlich", "title" : "Artikel"})
> db.test.ensureIndex({ "$**" : "text" }, { "default_language" : "de" })
> db.test.count({ "$text" : { "$search" : "vermutlich" } })
1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |