如何解决Elasticsearch Spring启动
我正在尝试使用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","_id" : "2","_score" : 0.85642433,"_source" : {
"myfield" : "I like playing in sand,what's mine is yours"
}
}
-----------------------------------------------------
-----------------------------------------------------
{
"_index" : "my_function_index","_id" : "1","_score" : 0.42347366,"_source" : {
"myfield" : "Doesn't remind me of anything"
}
}
-----------------------------------------------------
第二个实例:
-----------------------------------------------------
{
"_index" : "my_function_index","_score" : 0.8440073,"_score" : 0.79675066,"_score" : 0.7430876,"_source" : {
"myfield" : "Doesn't remind me of anything"
}
}
-----------------------------------------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。