使用elasticsearch Java API编写分数搜索脚本

问题描述 投票:0回答:1

我有以下查询可与 Elasticsearch 一起使用。

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "script_score": {
        "script": {
          "source": "cosineSimilarity(params.query_vector, 'vector') + 1",
          "params": {
            "query_vector": [/* Your query vector here */]
          }
        }
      }
    }
  }
}

我正在尝试使用新的 Java API 将此查询转换为 kotlin。不幸的是,我无法找到有关如何转换此查询的文档。我尝试了多种方法但没有效果。

我已从 chatGPT 尝试了以下操作,但无法使其正常工作。

fun main() {
    val queryVector = /* Your query vector here */

    val scriptScoreFunction = ScriptScoreFunction(
        Script("painless", "cosineSimilarity(params.query_vector, 'vector') + 1"),
        mapOf("query_vector" to queryVector)
    )
    
    val functionScoreQuery = FunctionScoreQuery(
        MatchAllQuery(),
        listOf(ScriptScoreFunctionBuilder(scriptScoreFunction))
    ).scoreMode(ScoreMode.SUM)
    
    val searchRequest = SearchRequest(Index("_all")).apply {
        source(SearchSourceBuilder().apply {
            query(functionScoreQuery)
        })
    }
    
    println(searchRequest.source().toString())

}

大多数资源也在使用旧的elasticsearch库,但我必须使用co.elastic.clients 这是最新的 java api 库

spring-boot kotlin elasticsearch elasticsearch-java-api
1个回答
0
投票

经过一番尝试和错误,我发现使用 latest Java Elasticsearch API ,代码将如下所示:

val scriptBuidler = ScriptBuilders.inline()
    .source(cosineSimilarity(params.query_vector, 'vector') + 1)
    .params("queryVector", Jsondata.of("[1.0, 2.0]"))
    .build()

SearchRequest.Builder()
    .index("name_of_index")
    .size(3)
    .minscore(0.01)
    .query(
        ScriptScoreQuery.Builder()
        .query(hshs)
        .script(
            ScriptBuilder().inline(scriptBuilder).build()
        )
        .build()
        ._toQuery()
    )
    .source(
        SourceConfig.Builder().build()
    )
    .build()
© www.soinside.com 2019 - 2024. All rights reserved.