如何将两个查询的结果合并到Elasticsearch中的不同索引?

vor*_*rou 4 c# elasticsearch nest

main-kittens我正在搜索类型文档的索引Kitty。现在,我想做一个实验。对于某些用户,我想experiment-kittens改为搜索。类型与 \xe2\x80\x94 相同Kitty,并且所有字段与主索引中的值相同,但是虽然Bio主索引中的字段始终为空,但在实验之一中它存储了巨大的字符串。

\n\n

Bio现在的问题是,由于内存/磁盘限制,我无法存储所有小猫的数据。所以experiment-kittens只有最近的小猫(比如上个月)。

\n\n

我希望大多数用户的搜索保持完整(即始终使用主索引)。对于选定的,我想合并结果。逻辑应该是:

\n\n
search userquery + date_created < 1 month ago in experiment-kittens\nsearch userquery + date_created > 1 month ago in main-kittens\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果应该按 排序create_date,但结果太多,无法在我的应用程序中进行排序。

\n\n

有没有办法让弹性对两个索引执行两个不同的查询并合并结果?

\n\n

(我也确信这个问题可能有更优化的解决方案,如果你有的话请告诉我)。

\n

bit*_*kar 5

您可以使用单个 Elasticsearch 请求搜索多个索引,方法是用逗号分隔索引名称。然后您可以使用 来missing filter区分两个索引(一个有Bio字段,另一个没有)。然后您可以使用range filter根据date_created字段值进行过滤。最后你可以使用sortAPI​​根据date_created字段的值进行排序。

将所有这些放在一起,您需要的 Elasticsearch 查询如下:

POST main-kittens,experiment-kittens/Kitty/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "bool": {
               "should": [
                  {
                     "bool": {
                        "must": [
                           {
                              "missing": {
                                 "field": "Bio"
                              }
                           },
                           {
                              "range": {
                                 "date_created": {
                                    "to": "now-1M"
                                 }
                              }
                           }
                        ]
                     }
                  },
                  {
                     "bool": {
                        "must_not": [
                           {
                              "missing": {
                                 "field": "Bio"
                              }
                           }
                        ],
                        "must": [
                           {
                              "range": {
                                 "date_created": {
                                    "from": "now-1M"
                                 }
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         }
      }
   },
   "sort": [
      {
         "date_created": {
            "order": "desc"
         }
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

您可以替换"match_all": {}为您可能拥有的任何自定义查询。