MongoDB Full Text on an Array within an Array of Elements

和自甴很熟 提交于 2020-08-27 05:58:39

问题


I am unable to retrieve documents when an array within an array of elements contains text that should match my search.

Here are two example documents:

{
    _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']
            }
        }
    ]
}

By using the following query, I am able to return both documents: db.collection.find({'foo.data.text': {'$in': ['Y']}}

However, I am unable to return these results using the full text command/index: db.collection.runCommand("text", {search" "Y"})

I am certain that the full text search is working, as the same command issuing a search against "Thing1" will return the first document, and "Thing3" returns the second document.

I am certain that both foo.data.text and foo.name are both in the text index when using db.collection.getIndexes().

I created my index using: db.collection.ensureIndex({'foo.name': 'text', 'foo.data.text': 'text'}). Here are the indexes as shown by the above command:

    {
            "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
    }

Any suggestion on how to get this working with mongo's full text search?


回答1:


Text search does not currently support indexed fields of nested arrays (at least not explicitly specified ones). An index on "foo.name" works fine as it is only one array deep, but the text search will not recurse through the subarray at "foo.data.text". Note that this behavior may change in the 2.6 release.

But fear not, in the meantime nested arrays can be text-indexed, just not with individually specified fields. You may use the wildcard specifier $** to recursively index ALL string fields in your collection, i.e.

db.collection.ensureIndex({"$**": "text" }

as documented at http://docs.mongodb.org/manual/tutorial/create-text-index-on-multiple-fields/ . Be careful though as this will index EVERY string field and could have negative storage and performance consequences. The simple document structure you describe though should work fine. Hope that helps.



来源:https://stackoverflow.com/questions/18770185/mongodb-full-text-on-an-array-within-an-array-of-elements

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!