Text search in aggregation using pymongo

474 views Asked by At

I have a collection named users, it has following attributes

{
“_id”: “937a04d3f516443e87abe8308a1fe83e”,
“username”: “andy”,
“full_name”: “andy white”,
“image” : “https://example.com/xyz.jpg”,
… etc
}

i want to make a text search on full_name and username using aggregation pipeline, so that if a user search for any 3 letters, then the most relevant full_name or username returned sorted by relevancy, i have already created text index on username and full_name and then i tried query from below link:

https://www.mongodb.com/docs/manual/tutorial/text-search-in-aggregation/#return-results-sorted-by-text-search-score

pipeline_stage = [
{"$match": {"$text": {"$search": “whit”}}},
{"$sort": {“score”: {"$meta": “textScore”}}},
{"$project": {“username”: 1,“full_name”: 1,“image”:1}}
]

stages = [*pipeline_stage]
users = users_db.aggregate(stages)

but i am getting below error:

pymongo.errors.OperationFailure: FieldPath field names may not start with ‘$’. Consider using $getField or $setField., full error: {‘ok’: 0.0, ‘errmsg’: “FieldPath field names may not start with ‘$’. Consider using $getField or $setField.”, ‘code’: 16410, ‘codeName’: ‘Location16410’, ‘$clusterTime’: {‘clusterTime’: Timestamp(1657811022, 14), ‘signature’: {‘hash’: b’a\xb4rem\x02\xc3\xa2P\x93E\nS\x1e\xa6\xaa\xb0\xb1\x85\xb5’, ‘keyId’: 7062773414158663703}}, ‘operationTime’: Timestamp(1657811022, 14)}

I also tried below link (my query also below) but i am getting full text search results, not working for partial text search: https://www.mongodb.com/docs/manual/tutorial/text-search-in-aggregation/#match-on-text-score

pipeline_stage = [
    {"$match": {"$text": {"$search": search_key}}},
    {"$project": {"full_name": 1, "score": {"$meta": "textScore"}}},
]

Any help will be appreciated,

Note: I want to do partial text search, sorted by relevant records at top,

Thanks

1

There are 1 answers

9
Belly Buster On

Your project stage is incorrect, it should be

pipeline_stage = [
    {"$match": {"$text": {"$search": "and"}}},
    {"$sort": {"score": {"$meta": "textScore"}}},
    {"$project": { "username": "$username", "full_name": "$full_name", "image": "$image"}}
]

Also note if you use an English text search, words like and are not indexed.