需要java的 es7.16版本向量检索api 和dsl语句
使用es自带的余弦相似度
支持1-6个的图片向量检索(向量已存在512维)
1-6个图片可同时参与检索,且是or的关系,需要分别返回得到倒叙前topn
可以设置得分,过滤指定分数以上的结果
可以取topn
es7.16版本向量检索api java
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- CSDN专家-sinJack 2023-07-13 15:33关注
参考:使用Java API实现ES 7.16版本的向量检索和DSL语句:
- 向量检索API
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery; import org.elasticsearch.common.lucene.search.function.FunctionScoreQueryBuilder; import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.elasticsearch.index.query.functionscore.WeightBuilder; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.script.ScriptType; import org.elasticsearch.script.mustache.SearchTemplateRequestBuilder; public class VectorSearch { private RestHighLevelClient client; public VectorSearch(RestHighLevelClient client) { this.client = client; } public SearchResponse search(String index, String field, float[] vector, int topN, float minScore) throws IOException { // 构建查询条件 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); for (int i = 0; i < vector.length; i++) { FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions = new FunctionScoreQueryBuilder.FilterFunctionBuilder[vector.length]; functions[i] = new FunctionScoreQueryBuilder.FilterFunctionBuilder( ScoreFunctionBuilders.weightFactorFunction(vector[i]), new WeightBuilder().setWeight(vector[i]) ); boolQuery.should(QueryBuilders.functionScoreQuery( QueryBuilders.matchAllQuery(), functions )); } // 设置查询参数 SearchRequest searchRequest = new SearchRequest(index); searchRequest.source().query(boolQuery) .size(topN) .minScore(minScore) .timeout(TimeValue.timeValueSeconds(10)); // 执行查询 SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); if (searchResponse.status() != RestStatus.OK) { throw new RuntimeException("Failed to execute search"); } return searchResponse; } }
- DSL语句
{ "query": { "bool": { "should": [ { "function_score": { "query": { "match_all": {} }, "functions": [ { "weight_factor": { "field1": 0.1 } } ] } }, { "function_score": { "query": { "match_all": {} }, "functions": [ { "weight_factor": { "field2": 0.2 } } ] } }, ... ] } }, "_source" : false, "size" : topN, "min_score" : minScore }
其中,
field1
、field2
等表示不同的图片向量字段,可以根据实际情况进行修改。解决 无用评论 打赏 举报
悬赏问题
- ¥15 已知平面坐标系(非直角坐标系)内三个点的坐标,反求两坐标轴的夹角
- ¥15 webots有问题,无响应
- ¥15 数据量少可以用MK趋势分析吗
- ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
- ¥15 大智慧怎么编写一个选股程序
- ¥100 python 调用 cgps 命令获取 实时位置信息
- ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
- ¥15 C语言使用vscode编码错误
- ¥15 用KSV5转成本时,如何不生成那笔中间凭证
- ¥20 ensp怎么配置让PC1和PC2通讯上