Easy-Es对Elasticsearch7.14向量检索,原生脚本写法

java 复制代码
import com.xinren.cdc.XrDataCdcApplication;
import com.xinren.cdc.dao.domian.es.DenseVectorData;
import com.xinren.cdc.dao.index.DenseVectorIndex;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.dromara.easyes.core.conditions.update.LambdaEsUpdateWrapper;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScriptScoreQueryBuilder;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@SpringBootTest(classes = XrDataCdcApplication.class)
class XrDataCdcApplicationTests {

    @Resource
    private DenseVectorIndex denseVectorIndex;

    @Test
    void createIndex() {
        denseVectorIndex.createIndex();
    }
    @Test
    void addIndex(){
        DenseVectorData data = new DenseVectorData();
        data.setId("1");
        data.setText("大家好,才是真的好");
        double[] doubles = new double[]{0.1,0.2,0.3,0.4,0.5};
        data.setVectors(doubles);
        denseVectorIndex.insert(data);
    }
    @Test
    void queryIndex(){
        double[] doubles = new double[]{0.1,0.2,0.3,0.4,0.5};
        Map<String, Object> params = Collections.singletonMap("query_vector", doubles);
        LambdaEsQueryWrapper<DenseVectorData> wrapper = new LambdaEsQueryWrapper<>();
        // 余弦相似
        Script scriptYx = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG,
                "cosineSimilarity(params.query_vector, 'vectors') + 1.0", params);
        // 点积距离
        Script scriptDj = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG,
                "dotProduct(params.query_vector, doc['vectors']) + 1",params);

        // 曼哈顿距离:l1norm
        Script scriptL1norm = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG,
                "1 / (1 + l1norm(params.query_vector, doc['vectors']))",params);

        // 欧几里得距离:l2norm
        Script scriptL2norm = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG,
                "1 / (1 + l2norm(params.query_vector, doc['vectors']))",params);

        // 曼哈顿距离的Painless自定义脚本(需要手动编写计算逻辑)
        String scriptSource = "double sum = 0;"
                + "for (int i = 0; i < params.query_vector.length; i++) {"
                + "  sum += Math.abs((doc['vectors'].vectorValue)[i] - params.query_vector[i]);"
                + "}"
                + "return sum;";
        // 创建Painless脚本
        Script scriptMhd = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scriptSource, params);

        wrapper.setSearchSourceBuilder(new SearchSourceBuilder().query(new ScriptScoreQueryBuilder(new MatchAllQueryBuilder(),scriptMhd)));
        List<DenseVectorData> denseVectorData = denseVectorIndex.selectList(wrapper);

        System.out.println(denseVectorData);
    }

    @Test
    void delIndex(){
        LambdaEsUpdateWrapper<DenseVectorData> wrapper = new LambdaEsUpdateWrapper<>();
        wrapper.eq(DenseVectorData::getId,"1");
        denseVectorIndex.delete(wrapper);
    }

}

Elasticsearch7.14安装插件后,创建查询索引

javascript 复制代码
PUT /my_index
{
  "mappings": {
    "properties": {
      "my_vector_field": {
        "type": "dense_vector",
        "dims": 3,      // 向量维度
        "similarity": "l2_norm" // 或 "cosine"
      }
    }
  }
}

POST /my_index/_doc
{
  "my_vector_field": [0.1, 0.2, 0.3], // 3维的向量数据
  "content": "这是文档的其他文本信息..."
}

GET /my_index/_search
{
  "query": {
    "elastiknn_nearest_neighbors": {
      "field": "my_vector_field",
      "model": "l2", // 或 "cosine"
      "vector": [0.1, 0.2, 0.3],
      "k": 5          // 返回最相似的 top-k 结果
    }
  }
}
相关推荐
计算机编程小咖30 分钟前
《基于大数据的农产品交易数据分析与可视化系统》选题不当,毕业答辩可能直接挂科
java·大数据·hadoop·python·数据挖掘·数据分析·spark
艾莉丝努力练剑31 分钟前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
老华带你飞1 小时前
校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园交友网站
自强的小白1 小时前
学习Java24天
java·学习
Ashlee_code2 小时前
香港券商櫃台系統跨境金融研究
java·python·科技·金融·架构·系统架构·区块链
还梦呦2 小时前
2025年09月计算机二级Java选择题每日一练——第五期
java·开发语言·计算机二级
2501_924890523 小时前
商超场景徘徊识别误报率↓79%!陌讯多模态时序融合算法落地优化
java·大数据·人工智能·深度学习·算法·目标检测·计算机视觉
從南走到北3 小时前
JAVA国际版东郊到家同城按摩服务美容美发私教到店服务系统源码支持Android+IOS+H5
android·java·开发语言·ios·微信·微信小程序·小程序
qianmoq4 小时前
第04章:数字流专题:IntStream让数学计算更简单
java
Elasticsearch4 小时前
推进数据成熟度旅程的 3 个步骤
elasticsearch