元素数组中数组上的MongoDB全文
当元素数组中的数组包含与我的搜索匹配的文本时,我无法检索文档 以下是两个示例文档:元素数组中数组上的MongoDB全文,mongodb,full-text-search,pymongo,Mongodb,Full Text Search,Pymongo,当元素数组中的数组包含与我的搜索匹配的文本时,我无法检索文档 以下是两个示例文档: { _id: ..., 'foo': [ { 'name': 'Thing1', 'data': { 'text': ['X', 'X'] } },{ 'name': 'Thing2', 'data': {
{
_id: ...,
'foo': [
{
'name': 'Thing1',
'data': {
'text': ['X', 'X']
}
},{
'name': 'Thing2',
'data': {
'text': ['X', 'Y']
}
}
]
}
{
_id: ...,
'foo': [
{
'name': 'Thing3',
'data': {
'text': ['X', 'X']
}
},{
'name': 'Thing4',
'data': {
'text': ['X', 'Y']
}
}
]
}
通过使用以下查询,我可以返回这两个文档:
db.collection.find({'foo.data.text':{'$in':['Y']}}
但是,我无法使用全文命令/索引返回这些结果:
db.collection.runCommand(“text”,{search”“Y})
我确信全文搜索正在工作,因为对“Thing1”发出搜索的同一命令将返回第一个文档,“Thing3”返回第二个文档
使用db.collection.getIndexes()
时,我确信foo.data.text和foo.name都在文本索引中
我使用以下命令创建了索引:db.collection.ensureIndex({'foo.name':'text','foo.data.text':'text})
{
"v" : 1,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"ns" : "testing.collection",
"background" : true,
"name" : "my_text_search",
"weights" : {
"foo.data.text" : 1,
"foo.name" : 1,
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 1
}
关于如何使用它的任何建议?文本搜索目前不支持嵌套数组的索引字段(至少不支持明确指定的字段)。在“foo.name”上的索引可以正常工作,因为它只有一个数组深,但文本搜索不会通过“foo.data.Text”的子数组递归“。请注意,此行为在2.6版本中可能会更改 但不用担心,同时嵌套数组可以进行文本索引,只是不能使用单独指定的字段。您可以使用通配符说明符$**递归索引集合中的所有字符串字段,即
db.collection.ensureIndex({"$**": "text" }
如中所述。但要小心,因为这将索引每个字符串字段,并可能会对存储和性能产生负面影响。您描述的简单文档结构应该可以正常工作。希望有帮助。您可以从
db.collection.getIndexes()提供全文索引定义吗
?可能它不包括foo.data.text
字段?我要注意,问题描述中的两个示例目前都有语法错误。find()
使用了错误的字段名(txt
而不是text
),应该是:db.collection.find({'foo.data.text':{'in':['Y']})
。全文搜索应该是db.fulltext.runCommand(“text”,{search:“Y”})
。我使用您的示例文档在MongoDB 2.4.6中尝试了这两种方法,得到了预期的结果。感谢您的评论。这是一个严格意义上的示例。我已更新以修复语法。如我所述,db.collection.getIndex()显示索引存在。我添加了.getIndex()输出。