元素数组中数组上的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()输出。