簡體   English   中英

帶有過濾器的彈性搜索聚合無法過濾聚合

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

消息:我想說一聲非常感謝您幫助我,我們幾個星期以來一直在通過堆棧溢出進行通信。 再次感謝堆棧溢出社區

解決方案:聚合結果:

收到您的映射后,以下是您在我使用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 的分析階段開始,了解分析器是什么以及構成分析器的各個部分,最后繼續閱讀Edge n-grams tokenizerCompletion Suggester

掌握所有這些概念需要一段時間,但是一旦掌握了竅門,就相對容易實現。

請注意,通配符查詢不是我推薦的。 一旦您了解並了解 Ngram 或 Edge Ngram 分詞器,您的查詢就可以像jav的簡單匹配查詢一樣簡單。 但是請閱讀鏈接中提到的概念。

讓我知道這是否有幫助,以及您是否需要進一步說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM