需要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等表示不同的图片向量字段,可以根据实际情况进行修改。解决 无用评论 打赏 举报