首页 > 解决方案 > 弹性搜索弹簧启动

问题描述

我正在尝试使用 java api 转换这个弹性搜索查询

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "random_score": {}
        }
      ],
       "score_mode": "sum"
    }
  }
}

这就是我所做的

  QueryBuilder query = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.randomFunction());

我试图以随机顺序返回所有匹配项,似乎不起作用

标签: javaspring-bootelasticsearch

解决方案


请参阅下面的示例以及我观察到的内容。它可能会有所帮助。我创建了一个具有单个类型字段myfield的示例映射text

样本文件:

POST my_function_index/_doc/1
{
  "myfield": "Doesn't remind me of anything"
}

POST my_function_index/_doc/2
{
  "myfield": "I like playing in sand, what's mine is yours"
}

POST my_function_index/_doc/3
{
  "myfield": "I like travelling backwards in the fog"
}

Java API 代码

package com.example.demo;

import java.io.IOException;

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery.ScoreMode;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class FunctionScore {

    public static void main(String[] args) throws IOException {

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));
        
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        
        //Below is the logic for creating functionScore via API
        FunctionScoreQueryBuilder functionScore = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.randomFunction());
        functionScore.scoreMode(ScoreMode.SUM);
        sourceBuilder.query(functionScore);

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("my_function_index");
        searchRequest.source(sourceBuilder);
        
        //The API Response you get
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);       
        SearchHit[] searchHits = searchResponse.getHits().getHits();
        
        //Printing the results
        for(SearchHit theHit: searchHits) {
            System.out.println("-----------------------------------------------------");
            System.out.println(theHit);
            System.out.println("-----------------------------------------------------");
        }

    }

}

观察到的反应:

下面是两个示例响应,您可以在其中获得相同顺序的文档,但请注意它们的_score值。它们是不同的。

请注意,每次运行上述 API 时,都会得到不同的响应。我想由于我的索引大小为 3,在某些时候我一定会得到相同的订单。

如果您有更多文档,则变化会更多。

第一个例子

-----------------------------------------------------
{
  "_index" : "my_function_index",
  "_type" : "_doc",
  "_id" : "3",
  "_score" : 0.8976933,
  "_source" : {
    "myfield" : "I like travelling backwards in the fog"
  }
}
-----------------------------------------------------
-----------------------------------------------------
{
  "_index" : "my_function_index",
  "_type" : "_doc",
  "_id" : "2",
  "_score" : 0.85642433,
  "_source" : {
    "myfield" : "I like playing in sand, what's mine is yours"
  }
}
-----------------------------------------------------
-----------------------------------------------------
{
  "_index" : "my_function_index",
  "_type" : "_doc",
  "_id" : "1",
  "_score" : 0.42347366,
  "_source" : {
    "myfield" : "Doesn't remind me of anything"
  }
}
-----------------------------------------------------

第二审:

-----------------------------------------------------
{
  "_index" : "my_function_index",
  "_type" : "_doc",
  "_id" : "3",
  "_score" : 0.8440073,
  "_source" : {
    "myfield" : "I like travelling backwards in the fog"
  }
}
-----------------------------------------------------
-----------------------------------------------------
{
  "_index" : "my_function_index",
  "_type" : "_doc",
  "_id" : "2",
  "_score" : 0.79675066,
  "_source" : {
    "myfield" : "I like playing in sand, what's mine is yours"
  }
}
-----------------------------------------------------
-----------------------------------------------------
{
  "_index" : "my_function_index",
  "_type" : "_doc",
  "_id" : "1",
  "_score" : 0.7430876,
  "_source" : {
    "myfield" : "Doesn't remind me of anything"
  }
}
-----------------------------------------------------

推荐阅读