elasticsearch - 具有过滤器的 Elasticsearch 聚合无法过滤聚合

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

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

最佳答案

解决方案:聚合结果:

发布收到您的映射后,下面是您在寻找我使用 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的Analysis阶段,了解Analyzer是什么以及组成Analyzer的各个部分,最后继续阅读Edge n-grams tokenizerCompletion Suggester

掌握所有这些概念将花费一些时间,但是一旦掌握了这些概念,就可以轻松实现它。

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

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

关于elasticsearch - 具有过滤器的 Elasticsearch 聚合无法过滤聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60588485/

相关文章:

elasticsearch - 无法在 Ubuntu 上的 kubernetes cluser 中访问 Kibana 仪表板服务

java - Elasticsearch 2.2.0 插件安全授权

linux - Logstash 在 Ubuntu 中没有显示任何输出

javascript - 使用elasticsearch按字母顺序排序

elasticsearch - Elasticsearch,如何使词组提示返回准确建议?

ElasticSearch 更新多字段映射

elasticsearch - 在索引类型的映射中更改属性的类型

elasticsearch - Filebeat:根据文档类型输出到不同的输出

elasticsearch - Elasticsearch 7.7 版本中跨多个索引的查询

elasticsearch - 使用应该的 Elasticsearch 查询不起作用