Elasticsearch-使用布尔(MUST&;AND)DSL查询创建报告过滤器


Elasticsearch - Create report filters using Bool (MUST & AND) DSL query

我正在尝试创建一些报表过滤器,用户可以在其中使用报表上的任何字段搜索配置文件。例如:搜索任何以ann开头的具有firstname和以vi开头的grade的配置文件。

以下是我迄今为止写的一个查询:

{
    from: 20,
    size: 20,
    query: {
        filtered: {
            query: {
                match_all: [ ]
            },
            filter: {
                bool: {
                    must: [
                        {
                            prefix: {
                                firstname: "ann"
                            }
                        },
                        {
                            prefix: {
                                grade: "vi"
                            }
                        }
                    ]
                }
            }
       }
   },
   sort: {
       grade: {
           order: "asc"
       }
   }
}

如果我删除must的一个子项(在bool过滤器中),它就起作用了。但一旦我使用了多个过滤器,它就不会返回任何结果,而且我需要能够使用其中的任何数量的条目。

此外,如果我使用should而不是must,它也可以工作。我不确定我是否误解了逻辑,但据我所知(在这种情况下)must应该只返回以ann开头的firstname和以vi开头的grade的结果。

它们确实存在,但是这个查询就是找不到它们。

我是不是遗漏了什么?

感谢

因为,我还不能发表评论。我用一些假设来回答。

首先,我使用的是ES 0.90.2 version,您的查询对我的输入很好。然而,根据您的输入大小和执行查询的平台,我的答案可能不正确。

假设:索引中的数据数量小于20。

我在索引中添加了以下输入:

'{"name": "ann", "grade": "vi"}'
'{"name": "ann", "grade": "ii"}'
'{"name": "johan", "grade": "vi"}'
'{"name": "johan", "grade": "ii"}'

我的测试查询与您的相同,结果如下:

"hits" : {
    "total" : 2,
    "max_score" : null,
    "hits" : [ ]          // <-- see this part is blank
  }

正如你所看到的,它没有列出命中率,但有两个命中率。这是因为from:20代码段。如果您更改该值,您可以看到一些结果。如果您想查看所有结果,只需删除该部分即可。

注意:如果不是这样的话,很抱歉打扰您:(