# Use knn inside functional\_score query

**URL:** https://discuss.elastic.co/t/use-knn-inside-functional-score-query/365554
**Category:** Elasticsearch
**Tags:** language-clients, vector-search
**Created:** [August 26, 2024, 1:53pm UTC](https://discuss.elastic.co/t/use-knn-inside-functional-score-query/365554 "2024-08-26T13:53:38Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![kunal\_foundit](https://avatars.discourse-cdn.com/v4/letter/k/ed8c4c/32.png) [@kunal\_foundit](https://discuss.elastic.co/u/kunal_foundit)
#### Post date: [August 26, 2024, 1:53pm UTC](https://discuss.elastic.co/t/use-knn-inside-functional-score-query/365554/1 "2024-08-26T13:53:38Z")

</div>

I am using elasticsearch-java client (co.elastic.clients) v8.11

I need to create a knn query inside functional\_score query similar to query shared below.

```auto
{
 "size": 3,
 "query": {
   "function_score": {
     "query": {
       "knn": {
           "field": "embedding",
           "query_vector": [2,2,2,0],
           "num_candidates": 10,
           "_name": "knn_query"
         }
     },
     "functions": [
       {
         "filter": { "match": { "department": "men" } },
         "weight": 100
       },
       {
         "filter": { "match": { "department": "women" } },
         "weight": 50
       }
     ]
   }
 }
}

```

I have created a KnnQuery object,

```auto
KnnQuery knnQuery = new KnnQuery.Builder()
                .field("title_vector")
                .queryVector(embeddings)
                .numCandidates(10)
                .similarity(similarityScore)
                .boost(getKnnBoost())
                .filter(filterQuery._toQuery())
                .build();

```

Now, how can I use it inside my FunctionScoreQuery ?

---

<div class="post-metadata">

### Author: ![ltrotta](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ltrotta/32/124003_2.png) [@ltrotta](https://discuss.elastic.co/u/ltrotta)
#### Post date: [August 26, 2024, 2:14pm UTC](https://discuss.elastic.co/t/use-knn-inside-functional-score-query/365554/2 "2024-08-26T14:14:34Z")

</div>

Hello and welcome! You can add any query to FunctionScoreQuery by using its builder like so:

```java
FunctionScoreQuery.of(fs -> fs
    .query(q -> q.knn(your-knn-query))
    .functions(list-of-functions));

```

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [August 26, 2024, 2:20pm UTC](https://discuss.elastic.co/t/use-knn-inside-functional-score-query/365554/3 "2024-08-26T14:20:20Z")

</div>

Welcome!

I'm not sure it's doable with this version as it has been introduced as a query in [8.12](https://www.elastic.co/guide/en/elasticsearch/reference/8.12/query-dsl-knn-query.html). Please update to 8.15.0 and you will be probably able to do something like:

```auto
client.search(sr -> sr
        .index(indexName)
        .query(q -> q.functionScore(
                fsq -> fsq
                        .query(qknn -> qknn.knn(
                                k -> k.field("vector").queryVector(0.9f, 0.4f, 0.8f)
                        ))
                        .functions(fs -> fs.randomScore(rs -> rs))
        ))
, Void.class);

```

I added an example here:

> <https://github.com/dadoonet/elasticsearch-java-client-demo/blob/fdb0b266a6ff3ecdaa07e22480c65df6e8e2ea4b/src/test/java/fr/pilato/test/elasticsearch/hlclient/EsClientIT.java#L997-L1019>
