我的弹性搜索索引存储了以下文档:
{
"id": "123",
"name": "My super object",
"tags": [
"level1",
"level2-A",
"level3-A-a"
]
}
或
{
"id": "234",
"name": "My super object",
"tags": [
"level1",
"level2-B",
"level3-B-a"
]
}
代表导航树的标签。
level1 -> level2-A -> level3-A-a
-> level2-B -> level3-B-a
-> level3-B-b
我想在一个查询中能够检索一组标签,每个标签最多标记十个对象。
一个例子更容易理解:
对于level2-A和level2-B,我想最多检索10个标记为level2-A和level2-B的对象。
有没有办法在一个查询中执行此操作,而不是查询每个标记?
答案 0 :(得分:0)
如果我正确理解了问题,您可以在单独的bool查询中为您关注的每个标记使用limit
filter。
例如......让我说我索引10个这样的文件:
{"tags": ["a"]}
和10喜欢这样:
{"tags": ["b"]}
如果我想要一个查询,它会为我提供3个带有{{1}}标记的文档和3个带有{{1}}标记的文档,这样就可以了:
"a"
但是,如果您的文档中包含多个标记,则可能会出现超过任何一个标记限制的情况。这就是我的意思......
我们假设我使用标记"b"
索引3个文档,然后使用标记
{
"query": {"match_all": {}},
"filter": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {"tags": "a"}
},
{
"limit": {"value": 3}
}
]
}
},
{
"bool": {
"must": [
{
"term": {"tags": "b"}
},
{
"limit": {"value": 3}
}
]
}
}
]
}
}
}
索引3个文档。如果您执行与上述相同的查询,则可能会获得包含["a"]
的6个文档 - 其中三个文档仅包含["a", "b"]
,另外三个文档包含"a"
和"a"
。如果这种行为对于您的用例是可接受的,那么上面的查询应该有效。
警告:"a"
过滤器会限制在分片级别中被视为的文档数量,而不是在索引级别。如果您的索引中有多个分片(我怀疑您可能会这样做),那么这种方法就不会起作用。我想在那种情况下你真的只需要进行多次查询。