【问题标题】:Elastic Search Aggregation with Filter unable to filter aggregation带有过滤器的弹性搜索聚合无法过滤聚合
【发布时间】:2020-06-20 15:08:01
【问题描述】:

您好,我们正在做一个项目,如果有人可以提供帮助,我们将陷入困境,那将是非常棒的

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
                            }
                        ]
                    }
                }
            }

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

【问题讨论】:

  • 嘿@soumil,以下解决方案是否解决了您的问题?你还有什么要找的吗!!?

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


【解决方案1】:

解决方案:聚合结果:

收到您的映射后,以下是我使用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 类的 contains 方法。您可以根据要查找的内容更改逻辑,以便仅过滤掉您想要的聚合值。

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

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

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

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

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

自动竞争问题:

第二个问题是自动完成功能,因此您需要了解一下它,因为有多种方法可以实现它。

但是,我建议您从了解 Elasticsearch 的 Analysis 阶段开始,了解什么是 Analyzer 及其构成 Analyzer 的各个部分,最后继续阅读有关 Edge n-grams tokenizerCompletion Suggester 的内容。

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

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

让我知道这是否有帮助,如果您想进一步澄清。

【讨论】:

  • 当然,先生,谢谢你,我会读到这意味着当我尝试你的查询时,它没有返回我所期望的这里是一个示例输出
  • { "key" : "java", "doc_count" : 888510 }, { "key" : "javascript", "doc_count" : 705903 }, { "key" : "html", " doc_count" : 567556 }, { "key" : "sql", "doc_count" : 563172 }, { "key" : "microsoft office", "doc_count" : 437694 }
  • 看它的名字,好像skills.keyword是一个数组?请您检查一下,如果是的话,请您分享一个示例文档,其中javahtml 的两个键都返回。
  • 你想要映射吗?
  • 是的,这会很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2014-07-11
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多