我在索引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
排序,并且有太多的内容可以在我的应用中对它们进行排序。
有没有办法让弹性对两个索引执行两个不同的查询并合并结果?
(我也确定可能有更优化的问题解决方案,如果你有问题,请告诉我。)
答案 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": {}
替换为您可能拥有的任何自定义查询。