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

时间:2015-08-28 09:05:18

标签: c# elasticsearch nest

我在索引main-kittens中搜索Kitty类型的文档。现在,我想进行一项实验。对于某些用户,我想要搜索experiment-kittens。类型相同 - Kitty,并且所有字段都具有与主索引中相同的值,但是在主索引中字段Bio始终为空,在实验中,它存储了大量字符串。

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

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

search userquery + date_created < 1 month ago in experiment-kittens
search userquery + date_created > 1 month ago in main-kittens

结果应按create_date排序,并且有太多的内容可以在我的应用中对它们进行排序。

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

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

1 个答案:

答案 0 :(得分:2)

通过使用逗号分隔索引名称,您可以使用单个Elasticsearch请求搜索多个索引。然后,您可以使用missing filter来区分两个索引(一个具有Bio字段而另一个不具有)。然后,您可以使用range filter根据date_created字段的值进行过滤。最后,您可以使用sort API根据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"
         }
      }
   ]
}

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