DocumentDB Vector Search with Filtering

0

Hi all, is it possible to do DocumentDB Vector Search with Filtering?

query = { "$search": { "vectorSearch": { "vector": [0.2, 0.6, 0.9], "path": 'vectorEmbedding', "similarity": 'euclidean', "k": 2, "efSearch": 40, 'filter': { '$and': [ { 'price': { '$gt': 20 }, 'price': { '$lt': 50 } } ] }, } } }

results = test_collection.aggregate([query])

for result in results: print(result)

It resulted in this error: OperationFailure: BSON field '$search.vectorSearch.filter' is an unknown field., full error: {'ok': 0.0, 'code': 40415, 'errmsg': "BSON field '$search.vectorSearch.filter' is an unknown field.", 'operationTime': Timestamp(1714105218, 1)}

wyseow
gefragt vor einem Monat70 Aufrufe
1 Antwort
0

I am facing the same problem, and I found a workaround. Just prepend a "$match" statement to your query. This way:

mycoll.insert_many([
    {"color": "blue", "vectorField": [0.82421875, -0.6953125]},
    {"color": "red", "vectorField": [0.82421875, -0.6953125]},
    {"color": "red", "vectorField": [0.05883789, -0.02038574]},
    {"color": "red", "vectorField": [0.2, 0.6]},
    {"color": "green", "vectorField": [-0.020385742, 0.32421875]}])

query = { "$search": { "vectorSearch": { "vector": [0.82421875, -0.6953125], "path": 'vectorField', "similarity": 'euclidean', "k": 2}}}
query_filter = {
    "$match": {
        "color":{ "$eq": "red"} 
    }
}

c = mycoll.aggregate([query_filter,query])
print(list(c))

I played a bit with this and it seems to work. I'll let mongo experts maybe comment if there is a better way.

AWS
beantwortet vor 3 Stunden

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen