使用elasticsearchTemplate.query()查询发现score字段为null

使用spring data elasticsearch遇到的问题(一)

  使用elasticsearchTemplate.query()查询发现score字段为null
  代码如下

 List<Map> maps = new ArrayList<>();
        maps =
                elasticsearchTemplate.query(
                        searchQuery,//这个自己写咯,就是一个查询语句
                        response -> {
                            SearchHits hits = response.getHits();
                            List<Map> list = new ArrayList<>();
                            Arrays.stream(hits.getHits())
                                    .forEach(
                                            h -> {
                                                System.out.println("分数为" + h.getScore());
                                                Map<String, Object> source = h.getSourceAsMap();
                                                    list.add(source);
                                                }
                                            });
                            return list;
                        });

问题为
然后就可以debug发现里面的_score分数为null,打印出来就发现score为NAN。

原因为
查询语句searchQuery里面使用了其它字段作为排序字段,es默认使用score为排序字段,如果使用其它字段作为排序字段,_score则为null

心得:
了解下了java8的stream以及如何查看拼接的es语句,收获挺多的,以及知道百度搜索可以以空格隔开关键字来进行查询。
至于报NAN的原因呢,未知,以后可能也不会遇到吧,但我还是去了解下了出现NAN是可能的原因是什么,一般出现在浮点数计算中,例如什么正无穷大,负无穷大,0/0,负数的平方根之类的,结果都是NAN。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Java中使用Elasticsearch查询向量数据,你需要使用Elasticsearch的Java客户端库来与Elasticsearch集群进行交互。以下是一个简单的示例代码,演示了如何使用Java客户端进行向量数据查询: 首先,确保你已经安装了Elasticsearch,并在Java项目中添加了Elasticsearch Java客户端的依赖。 ```java 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.unit.DistanceUnit; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.elasticsearch.index.query.functionscore.ScriptScoreFunctionBuilder; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; public class ElasticsearchVectorQueryExample { public static void main(String[] args) { // 创建一个RestHighLevelClient实例 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder("localhost:9200")); // 构建查询请求 SearchRequest searchRequest = new SearchRequest("your_index_name"); searchRequest.types("your_document_type"); // 替换为你的索引和文档类型 // 构建查询条件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders .functionScoreQuery(QueryBuilders.matchAllQuery()) .add(ScoreFunctionBuilders .scriptFunction(new Script( ScriptType.INLINE, "knn", "params.queryVector = [1, 2, 3];\n" + "params.field = 'your_vector_field';\n" + "double[] vector = doc[params.field].value;\n" + "double sum = 0;\n" + "for (int i = 0; i < vector.length; i++) {\n" + " sum += Math.pow(vector[i] - params.queryVector[i], 2);\n" + "}\n" + "return 1 / (1 + Math.sqrt(sum));", null))) .boostMode("replace")); // 设置查询结果的距离单位 sourceBuilder.trackScores(true).trackTotalHits(true) .postFilter(QueryBuilders .geoDistanceQuery("location") .point(40, -70) // 中心点坐标 .distance(10, DistanceUnit.MILES)); // 距离与单位 searchRequest.source(sourceBuilder); try { // 执行查询 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); // 处理查询结果 // ... } catch (IOException e) { e.printStackTrace(); } finally { // 关闭Elasticsearch客户端连接 try { client.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在上面的示例代码中,我们使用了function_score查询来执行向量相似度计算。`params.queryVector`是你要查询的向量数据,`params.field`是存储向量数据的字段名。你可以根据实际情况修改这两个参数。 注意,在执行查询之前,你需要替换`"your_index_name"`和`"your_document_type"`为你的索引名和文档类型名。此外,你还可以根据需要设置其他查询条件,例如地理位置过滤等。 希望这个示例对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值