java - 弹性搜索弹簧启动
问题描述
我正在尝试使用 java api 转换这个弹性搜索查询
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"random_score": {}
}
],
"score_mode": "sum"
}
}
}
这就是我所做的
QueryBuilder query = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.randomFunction());
我试图以随机顺序返回所有匹配项,似乎不起作用
解决方案
请参阅下面的示例以及我观察到的内容。它可能会有所帮助。我创建了一个具有单个类型字段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"
}
}
-----------------------------------------------------
推荐阅读
- google-cloud-dataflow - 数据流作业 - update_if_exists?
- azure - 警告:ansible 2.10.3 不提供额外的“天蓝色”
- javascript - 通过反应性方式更新组件
- ansible - Ansible - 从动态变量中设置事实
- python - 如何替换文件中的列表?
- java - 重新启动春季批处理作业
- java - 在 Java 中执行 while 循环以捕获异常
- apache-spark - PySpark 从其数组对象值中获取相关记录
- javascript - 为蛇游戏生成一个新的随机画布点
- python - 属性错误:'dict' 对象没有属性 find_all 错误