Elasticsearch通过标签进行多重搜索

时间:2014-04-07 07:42:33

标签: arrays elasticsearch

我的弹性搜索索引存储了以下文档:

{
  "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的对象。

有没有办法在一个查询中执行此操作,而不是查询每个标记?

1 个答案:

答案 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"过滤器会限制在分片级别中被视为的文档数量,而不是在索引级别。如果您的索引中有多个分片(我怀疑您可能会这样做),那么这种方法就不会起作用。我想在那种情况下你真的只需要进行多次查询。