FlagEmbedding icon indicating copy to clipboard operation
FlagEmbedding copied to clipboard

关于稀疏向量检索的使用

Open wwz0123 opened this issue 1 year ago • 7 comments

我使用ES的script_score检索可以基本实现稀疏向量检索,目前来看速度也还可以,几乎是毫秒级返回结果

若有其他方法心得,期待大家的讨论

wwz0123 avatar Mar 13 '24 02:03 wwz0123

could you give an example to show how to use sparse retrieve?

Mrfranken avatar Mar 13 '24 02:03 Mrfranken

index构建为{ "mappings": { "properties": { "vector": { "type": "object" //数据样例{"1": 0.8, "5": 0.1, "100000": 0.1} }} 使用script_score查询match_all,编写painless脚本实现计算功能 Map docVector = doc['vector']或params._source['vector']; for (Map.Entry entry : params.queryVector.entrySet()) { String token = entry.getKey(); if (docVector.containsKey(token)) { scores += entry.getValue() * docVector[token]; } } 供参考。

wwz0123 avatar Mar 13 '24 05:03 wwz0123

我发现存成object会有索引超出1000限制的问题。 有两种解决办法: 1、扩大索引限制。可能需要较大内存,并在一定程度上影响效率。 2、不存成object,以字符串的形式存成keyword,就不会超出索引限制。此时painless的解析语言需要随之做出一定调整,由对object的解析转为对字符串的解析。同样能完美解决此问题。

wwz0123 avatar Mar 14 '24 01:03 wwz0123

@wwz0123 hi,我目前使用的是python语言,请问这种复杂的script,在使用python的es client时能否调用呢?感恩

Mrfranken avatar Mar 19 '24 04:03 Mrfranken

hi,我目前使用的是python语言,请问这种复杂的script,在使用python的es client时能否调用呢?感恩

可以的,我使用的也是python语言,使用request库进行ES的script接口调用就可以。速度是比较快的。

wwz0123 avatar Mar 21 '24 08:03 wwz0123

我发现存成object会有索引超出1000限制的问题。 有两种解决办法: 1、扩大索引限制。可能需要较大内存,并在一定程度上影响效率。 2、不存成object,以字符串的形式存成keyword,就不会超出索引限制。此时painless的解析语言需要随之做出一定调整,由对object的解析转为对字符串的解析。同样能完美解决此问题。

您好,以字符串的形式存成keyword,这里能给个实际能用的painless脚本吗。 我对脚本语法不是很懂,下面出现编译错误。

body = {
    "query": {
        "function_score": {
            "query": {
                "match": {"content": query}
            },
            "script_score": {
                "script": {
                    "source": """
                    def scores = 0;
                    def docVector = JSON.parse(params._source.vector);
                    for (Map.Entry entry : params.queryVector.entrySet()) {
                        String token = entry.getKey();
                        if (docVector.containsKey(token)) {
                            scores += entry.getValue() * docVector[token];
                        }
                    }
                    return scores;
                    """,
                    "params": {
                        "queryVector": sparse_embedding
                    }
                }
            }
        }

    }
}```

YYGe01 avatar Apr 28 '24 10:04 YYGe01