我正在建立一个Elasticsearch集群来搜索与id相关的向量。
例如
提供此数据:
Parent id / Object id / vectors
P1 / BD / 123, 125, 235 ... 10304, 50305
P1 / DF / 125, 235, 240 ... 10305, 10306
P1 / ED / 123, 235, 350 ... 10010, 10344
...
P2 / AB / 125, 535, 740 ... 9315, 10306
P2 / VC / 133, 435, 350 ... 3010, 20344
P2 / RF / 113, 353, 390 ... 10110, 30344
...
There are millions of parents
hundreds of objects in a parent
1000 vectors in an object
所以基本上我想
这是我期望的示例结果
Input:
P999 / HH / xxx, xxx ...
P999 / YH / xxx, xxx ...
P999 / GJ / xxx, xxx ...
...
Output:
[result sorted desc]
P20 has 60 similar objects
P4 has 45 similar objects
P501 has 41 similar objects
...
similar objects: at least 50 vector matches
为此, 我需要
在这三个方面,我需要一些帮助。
curl -XPOST url/vectors -d '{
"mappings" : {
"properties": {
"object_id":{"type":"text"},
"parent_id":{"type":"text"},
"vectors":{"type":"text"}
}
}
}'
curl -XPUT url/vectors -d '{
"parent_id":"P1",
"object_id":"BD",
"vectors":"123, 125, 235 ... 10304, 50305"}
}'
curl -XGET url/vectors -d '{
"size":10000,
"query" {
"function_score": {
"functions": [
{
???
}
],
"query": {
"bool": {
"should": [
{ "terms"{"vectors":["111"] },
{ "terms"{"vectors":["222"] },
...
{ "terms"{"vectors":["333"] },
{ "terms"{"vectors":["444"] }
]
}
},
"minimum_should_match": "50",
}
},
"from": 0,
"sort":
[
{
"_score": {
"order": "desc"
}
}
]
}'
我的问题是
谢谢
答案 0 :(得分:0)
我怀疑您可以使用纯Elasticsearch查询获得所需的输出。
我要做的是拥有一个Python脚本,该脚本可以以编程方式更改要搜索的向量。然后取决于响应的大小,您可能需要使用Scan API才能返回所有匹配项 您的最终查询看起来像这样
"query" : {
"bool" : {
"should" : [
//THIS IS THE PART THAT YOU PROGRAMATICALLY FILL USING THE VECTORS FROM THE PARENT YOU SPECIFIED
{"match" : {"vector" : "111"}},
{"match" : {"vector" : "222"}},
{"match" : {"vector" : "333"}},
...
{"match" : {"vector" : "444"}},
],
"minimum_should_match": "50"
}
}
然后您将使用python确定P999和所有匹配项之间的匹配向量数
是否有您不使用图形数据库的原因?使用图形数据库可以更容易,更快捷地找到这种关系。
如果必须使用功能评分,请将其添加到上面的查询中。
它应该做的是为每个匹配的文档添加权重,但是我相当确定它会添加查询本身将对文档进行评分非常好
"function_score": {
"query": { "match_all": {} },
"boost": "5",
"functions": [
{
"filter": { "match": { "vector": "111" } },
"weight": 1
},
{
"filter": { "match": { "vector": "222" } },
"weight": 1
}
...
],
"max_boost": 1,
"score_mode": "max",
"boost_mode": "replace",
"min_score" : 0
}