Можно ли "объединить" два индекса вasticsearch с помощью запроса - PullRequest
4 голосов
/ 04 октября 2019

Я знаю, что нет возможности объединить индексы вasticsearch, но мне нужно найти способ решить эту проблему:

У меня есть 2 индекса, например, A, B

IndexA имеет такую ​​информацию, как field1, field2, field3 IndexB имеют field4, field5, field6

И если я буду искать по полю5 запроса (в данном случае «test»), я хочу, чтобы все отношения были вдревовидная структура:

Соответствует всем документам из IndexA, что соответствует "field2" - из IndexA и "field5" из IndexBНапримерДокументы IndexA:5, «тест», «тест2»,10, «тест», «тест7»11, «test10», «test11»

Документы IndexB:1, «тест», (...)2, «тест», (...)3, "test100", (...)

Пример ответа:для id5 (из indexA) я хочу получить объект с идентификаторами 1 и 2 из indexB, например {id: 5, response: {1, 2}}для id10 (из IndexA) я хочу получить объект с идентификаторами 1 и 2 из indexB, например {id: 10, response: {1, 2}}для id11 совпадений нет ("test10"! = "test"){id: 11, ответы: {}}

Мэйб, есть какой-нибудь способ решить эту проблему? Наконец, мне нужно сделать это для четырех индексов (но если это возможно между двумя, я могу сделать это на 4, а также).

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Я не думаю, что это возможно в эластичном поиске, как вы и сказали. Вы не должны создавать индексы с такими отношениями. Было бы лучше переосмыслить вашу модель и денормализовать данные.

Чтобы решить эту проблему, вам придется программно выполнять обработку в своем бэкэнде. Псевдокод:

//Get all objects from indexA
const allIndexA = indexA.getAll();
const result = new Array();
//For each object in indexA, select the corresponding object in indexB
allIndexA.forEach((entryA) => {
    const entriesB = indexB.get({field5: entryA.field2});
    result.push({
        entryA,
        entriesB
    });
});
0 голосов
/ 04 октября 2019
                I was tring as bellow:

                GET /_msearch
                {
                  "_index": [
                    "index1",
                    "index2",
                    "index3"
                  ]
                }
                {
                  "query": {
                    "bool": {
                      "should": [
                        {
                          "match": {
                            "index3id": "1"  // it is in the 3th index so i have responses from 3th index
                          }                  // only
                        }                                           
                      ]
                    }
                  },
                  "size": 100,
                  "aggregations": {
                    "firstLevel": {
                      "top_hits": {
                        "size": 100,
                        "_source": {
                          "includes": "index3id"
                        }
                      }
                    }
                  }
                }

                response of aggregation here:

                 "aggregations": {
                   "firstLevel": {
                          "hits": {
                            "total": 2,
                            "max_score": 1,
                            "hits": [
                              {
                                "_index": "index3",
                                "_type": "someTypeNotRelevant",
                                "_id": "81",
                                "_score": 1,
                                "_source": {
                                  "index3id": 1
                                }
                              },
                              {
                                "_index": "index3",
                                "_type": "someTypeNotRelevant",
                                "_id": "61",
                                "_score": 1,
                                "_source": {
                                  "index3id": 1
                                }
                              }
                            ]
                          }
                        }
                      }

    Now I just want to do a new query in index2 for some field but with values which were in 
    _source(in this case - for the all index3id's) (i was thinking about some sub-aggregation to firstLevel": {} aggregation - but with use of new query to index2). 
There are 2 problems:
1. How to pass these index3id's?
2. After first query, I have only "data" from index3 because of using index3id
Anyway thank you for advice.
...