Elastic Search Aggregation with Filter 无法过滤聚合

Elastic Search Aggregation with Filter unable to filter 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
                            }
                        ]
                    }
                }
            }

留言: 我想非常感谢您帮助我,几周以来我们一直在通过堆栈溢出进行通信。 再次感谢堆栈溢出社区

解决方案:聚合结果:

Post 收到你的映射,下面是你正在寻找的我使用 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 使用了 String class 的 contains 方法。您可以根据您要查找的内容更改逻辑,以便只过滤掉您想要的聚合值。

您可能必须过滤聚合响应的原因是您的示例文档可能具有多种技能,如下例所示:

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

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

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

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

自动竞争问题:

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

不过,我建议您先了解 Analysis phase of Elasticsearch, understand what an Analyzer is and its various parts that constitute Analyzer, finally moving on to reading about Edge n-grams tokenizer and Completion Suggester

掌握所有这些概念需要一段时间,但一旦掌握了窍门,实施起来就相对容易了。

请注意,我不推荐使用通配符查询。一旦您了解并了解了 Ngram 或 Edge Ngram 分词器,您的查询就可以像 jav 的简单匹配查询一样简单。但是请务必阅读链接中提到的概念。

让我知道这是否有帮助,以及您是否需要进一步的说明。