Elasticsearch KnnQuery与Java客户端8.13版本k参数必填矛盾求助
Elasticsearch 8.13 Java客户端KnnQuery必须传k参数的问题解决
不少开发者都碰到过这个矛盾情况:Elasticsearch官方文档明确说KnnQuery不需要设置k参数,由size参数替代,但8.13版本的Java客户端却强制要求传入k,否则抛出co.elastic.clients.util.MissingRequiredPropertyException异常。
临时解决办法
- 直接传入和
size参数相同的数值给k:虽然文档说size会替代k的作用,但当前版本客户端的校验逻辑要求必须传这个参数。这么做既能绕过异常,实际返回结果的数量还是由size控制,不会因为传了k而多返回数据。 - 示例代码:
// 构建KnnQuery时传入和size一致的k值 KnnQuery knnQuery = KnnQuery.of(q -> q .field("vector_field") .queryVector(yourQueryVector) .k(10) // 和下面search请求的size保持相同 .numCandidates(60) ); // 发起查询,用size控制最终返回数量 SearchResponse<YourEntity> response = client.search(s -> s .index("target_index") .query(q -> q.knn(knnQuery)) .size(10), YourEntity.class );
问题根源
这是Elasticsearch Java客户端8.13版本的一个bug,后续发布的8.13.1及更高版本已经修复了这个问题。如果项目允许,直接升级客户端到最新兼容版本,就能按照官方文档的说明,不用传k参数,只靠size控制返回结果数。
内容的提问来源于stack exchange,提问作者ajs
相关产品推荐
相关产品推荐

