具有过滤器的弹性搜索聚合无法过滤聚合

时间:2020-03-08 14:27:50

标签: elasticsearch elastic-stack elasticsearch-5 elasticsearch-aggregation

您好,我们正在研究一个项目,如果有人可以帮上忙,那我们就陷在了这个问题上

GET xyxz/_search
{
   "size":0,
   "aggs":{
      "company":{
         "terms":{
            "field":"skills.name.keyword",
            "size":10
         }
      }
   },
   "query":{
      "bool":{
         "must":[

         ],
         "filter":[

         ],
         "should":[
            {
               "wildcard":{
                  "skills.name":{
                     "value":"jav*"
                  }
               }
            }
         ],
         "must_not":[

         ]
      }
   }
}

新更新的查询

                    POST INDEX/_search
                    {
                        "size": 0,
                        "aggs": {
                            "my_terms": {
                                "terms": {
                                    "script": {
                                        "inline": """
                                if(doc['skills.name.keyword'].size()>0)
                                {                   
                                    if(doc['skills.name.keyword'].value.contains("jav"))
                                    {
                                      return doc['skills.name.keyword'];
                                    }
                                }
                              """
                                    },
                                    "size": 10
                                }
                            }
                        }
                    }

样品响应

            {
                "took" : 7469,
                "timed_out" : false,
                "_shards" : {
                    "total" : 1,
                    "successful" : 1,
                    "skipped" : 0,
                    "failed" : 0
                },
                "hits" : {
                    "total" : {
                        "value" : 10000,
                        "relation" : "gte"
                    },
                    "max_score" : null,
                    "hits" : [ ]
                },
                "aggregations" : {
                    "my_terms" : {
                        "doc_count_error_upper_bound" : 0,
                        "sum_other_doc_count" : 871,
                        "buckets" : [
                            {
                                "key" : "java",
                                "doc_count" : 121
                            },
                            {
                                "key" : "javascript",
                                "doc_count" : 77
                            },
                            {
                                "key" : "sql",
                                "doc_count" : 62
                            },
                            {
                                "key" : "core java",
                                "doc_count" : 46
                            },
                            {
                                "key" : "xml",
                                "doc_count" : 43
                            },
                            {
                                "key" : "software development",
                                "doc_count" : 36
                            },
                            {
                                "key" : "requirements analysis",
                                "doc_count" : 34
                            },
                            {
                                "key" : "microsoft sql server",
                                "doc_count" : 31
                            },
                            {
                                "key" : "java enterprise edition",
                                "doc_count" : 30
                            },
                            {
                                "key" : "jquery",
                                "doc_count" : 27
                            }
                        ]
                    }
                }
            }

消息: 我要说非常感谢,感谢您的帮助,自从几周以来我们一直在通过堆栈溢出进行通信。 再次感谢堆栈溢出社区

1 个答案:

答案 0 :(得分:0)

解决方案:汇总结果:

收到您的映射后,下面是您在使用Scripted Terms Aggregation的地方所要查找的内容:

POST <your_index_name>/_search
{
  "size": 0,
  "aggs": {
    "my_terms": {
      "terms": {
        "script": {
          "inline": """
            if(doc['skills.name.keyword'].size()>0){                    <---- Note this logic I've added 
                if(doc['skills.name.keyword'].value.contains("jav")){
                  return doc['skills.name.keyword'];
                }
            }
          """
        }, 
        "size": 10
      }
    }
  }
}

请注意,对于Java,我已经使用contains类的String方法。您可以根据要查找的内容更改逻辑,以便仅过滤出想要的聚合值。

您可能必须过滤汇总响应的原因是由于您的示例文档可以具有以下示例中所述的多种技能:

{
  "skills": [
    {
      "name": "java"
    },
    {
      "name": "javascript"
    },
    {
      "name": "c++"
    }
    ]
}

请注意,您的解决方案属于object数据类型。

查询结果将返回整个文档,然后聚合查询将在这些结果之上运行。

因此,如您所见,以上文档也有c++,它也将包含在聚合查询中。在hits上实现聚合的唯一方法是利用我已经提到的脚本化逻辑。

自动竞争问题:

第二个问题是自动完成功能,为此,您需要阅读一些有关它的信息,因为有多种实现方法。

但是,我建议您从了解Elasticsearch的{​​{3}}阶段开始,了解Analysis是什么以及它组成Analyzer的各个部分,最后继续阅读{{3} }和Analyzer

掌握所有这些概念将花费一些时间,但是一旦掌握了这些概念,就很容易实现它。

请注意,我不建议使用通配符查询。了解并了解Ngram或Edge Ngram标记生成器后,您的查询就可以像对jav的简单匹配查询一样简单。但是请务必阅读链接中提到的概念。

让我知道这是否有帮助以及您是否需要进一步澄清。

相关问题