如何将两个查询的结果合并到 Elasticsearch 中的不同索引?
How to merge the results of two queries to different indices in Elasticsearch?
我正在索引 main-kittens
中搜索 Kitty
类型的文档。现在,我想运行做一个实验。对于某些用户,我想改为搜索 experiment-kittens
。类型是相同的——Kitty
,并且所有字段的值都与主索引中的相同,但是虽然主索引中的字段 Bio
始终为空,但在实验性索引中它存储了巨大的字符串。
现在,问题是由于 memory/disk 限制,我无法为所有小猫存储 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
排序,在我的应用程序中结果太多无法排序。
有没有办法让 elastic 在两个索引上执行两个不同的查询并合并结果?
(我也确信这个问题可能有更优的解决方案,如果你有的话请告诉我)。
您可以通过单个 Elasticsearch 请求跨多个索引进行搜索,方法是用逗号分隔索引名称。然后您可以使用 missing filter
to differentiate between the two indices (one having Bio
field and the other not). Then you can use the range filter
to filter based on the value of date_created
field. Finally you can use the 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": {}
替换为您可能拥有的任何自定义查询。
我正在索引 main-kittens
中搜索 Kitty
类型的文档。现在,我想运行做一个实验。对于某些用户,我想改为搜索 experiment-kittens
。类型是相同的——Kitty
,并且所有字段的值都与主索引中的相同,但是虽然主索引中的字段 Bio
始终为空,但在实验性索引中它存储了巨大的字符串。
现在,问题是由于 memory/disk 限制,我无法为所有小猫存储 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
排序,在我的应用程序中结果太多无法排序。
有没有办法让 elastic 在两个索引上执行两个不同的查询并合并结果?
(我也确信这个问题可能有更优的解决方案,如果你有的话请告诉我)。
您可以通过单个 Elasticsearch 请求跨多个索引进行搜索,方法是用逗号分隔索引名称。然后您可以使用 missing filter
to differentiate between the two indices (one having Bio
field and the other not). Then you can use the range filter
to filter based on the value of date_created
field. Finally you can use the 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": {}
替换为您可能拥有的任何自定义查询。