Elasti c Агрегация поиска с фильтром, который не может фильтровать агрегацию - PullRequest
1 голос
/ 08 марта 2020

Здравствуйте. Мы работаем над проектом, и мы застряли в этом, если кто-то может помочь, это было бы действительно здорово

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 голосов
/ 08 марта 2020

Решение: Результат агрегации:

После получения вашего сопоставления ниже вы найдете то, что вы искали, где я использовал 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
      }
    }
  }
}

Обратите внимание, что я использовал contains метод String класса для Java. Вы можете изменить logi c в соответствии с тем, что вы ищете, чтобы отфильтровывались только те значения агрегации, которые вам нужны.

Причина, по которой вам может потребоваться отфильтровать отклик агрегации, заключается в том, что в вашем образце документа может быть несколько навыков, как в примере ниже:

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

Обратите внимание, что ваше решение имеет object тип данных.

В результате запроса будет возвращен весь документ, затем агрегирующий запрос будет выполнен поверх этих результатов.

Так что, как видите, в приведенном выше документе также есть c++ и что он также будет включен в запрос агрегации. Единственный способ добиться агрегирования на hits - это использовать скриптовые логи c, о которых я упоминал.

Вопрос автозаполнения:

Второй вопрос - это функция автозаполнения и что вам нужно прочитать немного об этом, так как есть разные способы достичь этого.

Однако я бы посоветовал вам начать с понимания Анализ фазы Elasticsearch, понять, что такое Анализатор и его различные части, составляющие Анализатор, и, наконец, перейти к к чтению о токенайзере Edge n-грамм и Подсказка по завершению .

Потребуется некоторое время, чтобы овладеть asp всеми этими концепциями, но как только вы освоите его, его будет относительно легко реализовать.

Обратите внимание, что подстановочные запросы я бы не рекомендовал. Когда вы поймете и узнаете о токенайзерах Ngram или Edge Ngram, ваш запрос может быть таким же простым, как простой запрос на совпадение для jav. Но прочитайте о концепциях, упомянутых в ссылках.

Дайте мне знать, если это поможет, и если вам нужны дальнейшие разъяснения.

...