0

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:

  1. Match item for a unique filed attribute (ItemId, str)
  2. For that item, run KNN search for Embeddings field
  3. Return top_k most similar items (no need for embeddings)

So far, I have been using two queries:

  1. Query by ItemId, return Embeddings for this item
  2. 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"]
}
Aramakus
  • 1,910
  • 2
  • 11
  • 22

0 Answers0