当前位置: 首页 > 知识库问答 >
问题:

是否可以使用query在elasticsearch中“连接”两个索引

曾昂然
2023-03-14

我知道在elasticsearch中没有连接索引的选项,但我需要找到一种方法来解决这个问题:

我有两个索引,比如A,B

IndexA的信息像field d1、field d2、field d3
IndexB有field d4、field d5、field d6

如果我将按查询字段5(在本例中为“test”)进行搜索,我希望树中的所有关系如下:

匹配IndexA中与“field2”(来自IndexA)和IndexB中的“field5”(来自IndexB)匹配的所有文档,例如,IndexA文档:
5、“test”、“test2”、“test”、“test7”、“test11”、“test10”、“test11”

IndexB文档:
1,“test”,(...)
2,“test”,(...)
3,“test100”,(...)

示例响应:
对于id5(来自indexA),我希望有一个来自indexB的id为1和2的对象,例如{id: 5,响应:{1,2}}
对于id10(来自IndexA),我希望有一个来自indexB的id为1和2的对象,例如{id: 10,响应:{1,2}}
对于id11没有匹配(“test10" ! = "测试”)
{id: 11,响应:{}}

有没有办法解决这个问题?最后,我需要对四个索引执行此操作(但如果两个索引之间有可能,那么我也可以对4执行此操作)。

共有2个答案

杜霍英
2023-03-14
                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.
越涵衍
2023-03-14

我认为这在elasticsearch中是不可能的,就像你说的。你不应该创建具有这样关系的索引。最好重新考虑你的模型并对数据进行非规范化。

为了解决这个问题,您必须在后端以编程方式进行处理。伪代码:

//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
    });
});
 类似资料:
  • 问题内容: 该ElasticSearch文件上写着: 别名也可以映射到多个索引,并且在指定别名时,别名将自动扩展为别名索引。 但是,当我尝试为2个索引添加别名并向两个索引写入时,似乎都没有随文档更新。如果删除其中一个别名,它将正确地写入仍然存在的别名。 具有多个写别名失败: 结果: 使用单个别名: 结果: Elasticsearch是否支持写入多个索引?如果别名指向多个索引,是否为只读? 问题答案

  • 问题内容: 我有两个必须分开的索引: 我将如何在搜索中“联接”这两个表,以使其返回以下内容: 问题答案: 正如您在其他问题中回答的那样,没有什么可以阻止您在建立索引时将名称存储在每个文档中,同时仍然具有包含数据的专用索引。请记住,这都是关于巧妙地对数据进行规范化,以便每个文档都可以根据需要实现“自包含”。 该解决方案的优点是每个订单商品都是完全独立的,您可以对其进行分组/汇总以获取给定订单的所有商

  • 问题内容: 在此系统中,我们存储产品,产品图像(产品可能有很多图像)和产品的默认图像。数据库: 如您所见,和,是循环参考。可以吗 问题答案: 不,那不行。表之间的循环引用是混乱的。请参阅这篇(已有十年的历史)文章:SQL By Design:循环参考 一些DBMS可以特别小心地处理这些问题,但是MySQL会遇到问题。 作为您的设计,第一选择是使两个FK之一为可空。这使您能够解决“鸡与蛋”问题(我应

  • 问题内容: 我真的很喜欢Lucene查询语言与ElasticSearch的简单可组合性。我们刚刚开始使用嵌套对象,并且我知道我需要使用嵌套查询来搜索它们,但是在使用Lucene语法进行嵌套查询时,我找不到任何信息。 如果可能的话,某处是否有一些文档? 我已经对“ elasticsearch lucene”进行了相当广泛的谷歌搜索,并且很难找到偶尔提及该语法的博客文章,更不用说实际的文档了。同样,在

  • 问题内容: 给定两个值x和y,我想将它们传递给另一个函数,交换它们的值并查看结果。这在Java中可行吗? 问题答案: 不与原始类型(,,等)。Java按值传递东西,这意味着函数传递的变量是原始变量的副本,并且您对该副本所做的任何更改都不会影响原始变量。 现在,对象有所不同,因为对象变量的“值”实际上是对对象的引用-复制该引用使其指向完全相同的对象。 局限性在于,您仍然无法以调用者可以看到的任何方式