Вопрос о схеме и запросе Elasticsearch - PullRequest
1 голос
/ 30 апреля 2019

Я настраиваю кластер 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

Так что в основном я хочу

  1. индексировать все векторы
  2. , учитывая вход 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

Чтобы достичь этого, мне нужно

  1. Хорошосхема
  2. Запрос, который хранит векторы
  3. Запрос, который ищет список похожих объектов в порядке убывания

И мне нужна помощь по этим трем.

  1. Схема
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"
      }
    }
  ]
}'

И мои вопросы

  1. В моем сопоставлении схемы это правильный способ хранения векторов?
  2. В моем поисковом запросе мне нужна помощь [???], чтобы получить ожидаемые результаты.И я даже не уверен, что на правильном пути.Вы бы исправили мой запрос, если ошиблись?

Спасибо

1 Ответ

1 голос
/ 30 апреля 2019

Я сомневаюсь, что вы можете получить желаемый результат, используя чистый запросasticsearch.

Я бы сделал скрипт 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 и всеми совпадениями

есть ли причина, по которой вы не используете базу данных графов?Подобные отношения было бы намного проще и быстрее найти с помощью графической базы данных.

Если вам нужно использовать функцию Score, я бы добавил это к приведенному выше запросу.

что он должен делатьэто добавление веса для каждого соответствующего документа, однако я уверен, что он добавит, что сам запрос довольно хорошо справится с оценкой документов

        "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
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...