Я настраиваю кластер Elasticsearch для поиска векторов, связанных с идентификатором.
Например,
Учитывая эти данные:
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
Так что в основном я хочу
- индексировать все векторы
- , учитывая вход P999, искать похожих родителей из кластера, находя наибольшее количество похожих объектов.(аналогичные объекты: не менее 50 векторных совпадений)
Вот пример результата, который я ожидаю
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"
}
}
]
}'
И мои вопросы
- В моем сопоставлении схемы это правильный способ хранения векторов?
- В моем поисковом запросе мне нужна помощь [???], чтобы получить ожидаемые результаты.И я даже не уверен, что на правильном пути.Вы бы исправили мой запрос, если ошиблись?
Спасибо