There are plenty of example of how to use Opensearch to query by a vector field using Vector Index. I am looking to using KNN, but I need to query:
- Match item for a unique filed attribute (ItemId, str)
- For that item, run KNN search for Embeddings field
- Return top_k most similar items (no need for embeddings)
So far, I have been using two queries:
- Query by ItemId, return Embeddings for this item
- KNN search for that item's Embeddings
Is it possible to combine them in one query?
Example index (using Python):
"settings": {
"index": {
"knn": True,
}
},
"mappings": {
"properties": {
"ItemId": {"type": "keyword"},
"TextBody": {"type": "text"},
"Embeddings": {
"type": "knn_vector",
"dimension": 1536,
},
}
}
Query by ItemId
query = {
"query": {"match": {"ItemId": <item_id>}},
"_source": True,
}
KNN search
query = {
"size": 4,
"query": {
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "knn_score",
"lang": "knn",
"params": {
"field": "Embeddings",
"query_value": <item_embeddings>,
"space_type": "l2",
},
},
}
},
"_source": False,
"fields": ["ItemId", "TextBody"]
}