elasticsearch 关于向量化检索

news/2024/5/5 20:46:58

1、elasticsearch使用的是8.5.0

索引和mapping构建:

PUT image-index
{"mappings": {"properties": {"mydatavector": {"type": "dense_vector","dims": 3,"index": true,"similarity": "dot_product"},"title": {"type": "text"}}}
}

 2、数据入库:使用python的elasticsearch 包如果为7.11的,可以同时兼容6.x、7.x、8.x版本

from sentence_transformers import SentenceTransformer

from elasticsearch import Elasticsearch

from elasticsearch.helpers import bulk

encoder = SentenceTransformer('你的模型本地路径')

client2 = Elasticsearch(['http://用户名:密码@IP:PORT'])

def batch_write(data):
    actions = [
        {

            "_index": "index_name",  # 替换为您的索引名称
            "_source": d,
            "_id": d["id"]

        }
        for d in data
    ]

    try:
        bulk(client2, actions)

    except Exception as e:
        print("bach write error")

def es_data_mapping(json_data):

    question = json_data["title"].strip().replace(" ", "")

    #注意这里的normalize_embeddings=True和mapping中的"similarity": "dot_product"相对应

    doc_vector = encoder.encode([question],convert_to_tensor=False,normalize_embeddings=True).tolist()[0]

    json_data["mydatavector"] = doc_vector

    return json_data

batch_write_num = 200

def write_data_2_es():

    data_list = [{"id":"1","title":"大家好"}]

    write_list = []

    for each in data_list:

        write_list.append(es_data_mapping(each))

        if len(write_list)>batch_write_num:

            batch_write(write_list)

            write_list.clear()

    if len(write_list) > 0:

        batch_write(write_list)

        write_list.clear()

if __name__ == '__main__':

    write_data_2_es()

3、查询检索:

POST http://IP:PORT/INDEX_NAME/_search

{

"_source": ["mydatavector","title"],

"min_score": 0.5,

    "knn": {
        "field": "mydatavector",

        "query_vector": [0,0,0],
        "k": 3,
        "num_candidates": 100,

        "filter": {
            "bool": {
                "must": [

                    {
                        "terms": {
                            "title": [

                                "狗头"
                            ]
                        }

                    }
                ]
            }

        }
    }
}

}


http://www.mrgr.cn/p/84078413

相关文章

华为机考入门python3--(16)牛客16-购物单最大满意度

分类:动态规划,组合,最大值,装箱问题 知识点: 生成递减数 100, 90, 80, ..., 0 range(100, -1, -10) 访问列表的下标key for key, value in enumerate(my_list): 动态规划-捆绑装箱问题 a. 把有捆绑约束的物…

LLM应用实战:当KBQA集成LLM(二)

本文主要是针对KBQA方案基于LLM实现存在的问题进行优化,主要涉及到图谱存储至Es,且支持Es的向量检索,还有解决了一部分基于属性值倒查实体的场景,且效果相对提升。1. 背景 又两周过去了,本qiang~依然奋斗在上周提到的项目KBQA集成LLM,感兴趣的可通过传送门查阅先前的文章…

2024年成都市非物质文化遗产代表性项目申报条件程序、材料时间安排

一、申报(推荐)条件 申报(推荐)列入市级非物质文化遗产代表性项目名录的项目应符合下列标准: (一)体现中华民族优秀传统文化,具有历史、文学、艺术、科学价值; &#…

Esko Ukkonen: On-line Construction of Suffix Trees

Esko Ukkonen: On-line Construction of Suffix Trees 文章目录 Esko Ukkonen: On-line Construction of Suffix Trees一、后缀树的概念及应用【详见刘方州同学报告】1.1 字典树 Trie1.2 后缀树 Suffix Tree2 后缀树的应用 二、朴素后缀树构造方法及问题三、线性时间内后缀树在…

计算机组成原理—数据的表示和运算

没有负值:无符号 前面最高符号 后面数字 有符号位 带符号数用什么编码形式表达 1.原码表示 如果是整数负数 那么1表示负值 后面用0补位 1表示2的n次方 2的n次方x的绝对值 表示数值大小 让加减法简单 改编码规则—补码

【vue3入门】-【19】组件嵌套关系

组件嵌套关系 组件允许我们将UI划分为独立的,可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被阻止成层层嵌套的树状结构 这和我们嵌套HTML元素的方式类似,Vue实现了自己的组件模型,使我们可以在每个组件内封装自定义内容和逻辑APP.vue <templ…

Polyomino

Polyomino 大致题意 给定一个 4444 的地图,地图上存在三个连通块,每个连通块用 # 连接。 现在你可以将这三个连通块任意平移、旋转到任何位置摆放,但你不可以翻转,问是否能刚好覆盖地图(即三个连通块不能有重合、超出地图或铺不满地图)。 解题思路 因为固定的有三个4X4的…

双向循环链表的增删改查功能

数据结构 双向循环链表 双向循环链表的增删改查 /***************************************************************************************************************** * * file name : DoubleCirLinkedList.c * author : cnzycwp@126.com * data : 2024/04/24 * fu…

模块化 手写实现webpack

模块化 common.js 的导入导出方法&#xff1a; require \ export 和 module.exports export 和 module.export nodejs 内存1.4G -> 2.8G cjs ESModule 主要区别&#xff1a; require属于动态类型&#xff1a;加载执行 同步 esmodul是静态类型&#xff1a;引入时并不会真的去…

ArcGIS无法开始编辑TIN!开始编辑TIN显示灰色

ArcGIS无法开始编辑TIN&#xff01;开始编辑TIN显示灰色&#xff1f; 解决方案&#xff01; 1、确认自定义——扩展模块中空间分析、3D分析模块勾选。 2、确认以上后&#xff0c;还是不能编辑的话&#xff0c;我们可以调出 3D分析分析工具条&#xff0c;你就会发现。TIN编辑工…

# 从浅入深 学习 SpringCloud 微服务架构(二)模拟微服务环境(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;二&#xff09;模拟微服务环境&#xff08;1&#xff09; 段子手168 1、打开 idea 创建父工程 创建 artifactId 名为 spring_cloud_demo 的 maven 工程。 --> idea --> File --> New --> Project --> Ma…

Unlink原理和一些手法

Unlink原理和一些手法 ✅简单介绍一下unlink相关的知识 unlink是利用glibc malloc 的内存回收机制造成攻击的,核心就在于当两个free的堆块在物理上相邻时,会将他们合并,并将原来free的堆块在原来的链表中解链,加入新的链表中其目的是把一个双向链表中的空闲块拿出来(例如 …

【vue3入门】-【4】插入html

原始html 双大括号,将会将数据插值为纯文本,而不是html,若想要插入html,则需要使用v-html指令 <template><h3>模版语法</h3><p>{{ tthtml }}</p> <!--会直接将html文本展示出来-->><p v-html="tthtml"></p> …

vue中函数使用、class和style属性、条件渲染、列表渲染、数据的双向绑定、input事件、过滤

【事件指令中的函数使用】1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <title>Title</title>6 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">…

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

边权并查集之奇偶游戏

题目传送门:https://www.acwing.com/problem/content/241/ //懒得手敲题目先给一下题解: #include<iostream> #include<unordered_map> //这个题目有两个点要想明白,一个是点到根的距离标志着这个点的性质,且在路径压缩的过程中此点不会改变 //第二点就是在出现…

【vue3入门】-【2】文本插值

文本插值 最基本的数据绑定形式是文本插值,它使用的是”Mustache“语法(即双大括号) <script> export default{data(){return{msg:"神奇的语法"}} } //以上为文本插值的固定使用格式 </script><template><h3>模版语法</h3><p>…

Redis 面试知识点

1、Redis缓存数据库一致性采用最终一致性,而不是采用强一致性,强一致性会导致系统吞吐量变差;采用双删除的策略,第二次删除,采用延迟删除;推荐采用,先操作数据库,直接删除缓存的方式;删除失败的情况,采用异步方式,重试操作;读取binlog异步删除,使用开源框架canal,…

tcp inflight 守恒算法的几何解释

接上文&#xff1a;tcp inflight 守恒算法背后的哲学 在 tcp inflight 守恒算法正确性 中&#xff0c;E bw / srtt 的公平最优解是算出来的&#xff0c;如果自然可以用数学描述&#xff0c;那能算出来的东西反过来也一定能通过直感看出来&#xff0c;我倾向于用几何和力学描述…