是小王同学啊~ 2023-07-10 11:51 采纳率: 0%
浏览 62
已结题

es7.16版本向量检索api java

需要java的 es7.16版本向量检索api 和dsl语句
使用es自带的余弦相似度
支持1-6个的图片向量检索(向量已存在512维)
1-6个图片可同时参与检索,且是or的关系,需要分别返回得到倒叙前topn
可以设置得分,过滤指定分数以上的结果
可以取topn

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-07-13 15:33
    关注

    参考:使用Java API实现ES 7.16版本的向量检索和DSL语句:

    1. 向量检索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; 
        }
    }
    
    1. 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
    }
    

    其中,field1field2等表示不同的图片向量字段,可以根据实际情况进行修改。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月14日
  • 修改了问题 7月11日
  • 赞助了问题酬金20元 7月11日
  • 修改了问题 7月11日
  • 展开全部

悬赏问题

  • ¥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通讯上