Запрос ElasticSearch должен и должен - PullRequest
1 голос
/ 14 марта 2019

У меня есть этот запрос для получения данных из экземпляра AWSasticSearch v6.2

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {"logLevel": "error"}
                },
                {
                    "bool": {
                        "should": [
                            {
                            "match": {"EventCategory": "Home Management"}
                            }
                        ]
                    }
                }
            ],
            "filter": [{
            "range": { "timestamp": { "gte": 155254550880 }}    
            }
        ]
        }
    },
    "size": 10,
    "from": 0
}

Мои данные имеют несколько категорий событий, например «Управление домом» и «Управление учетными записями пользователей». Проблема с этим внутри should, имея match, возвращает все данные, потому что фраза «Управление» относится к обеим категориям. Если я использую term вместо match, он вообще ничего не возвращает, даже если заданное значение точно такое же, как в документе.

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

EDIT: Не может быть ни одного, одного или более EventCategory в should предложение

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Я не уверен, почему вы добавили should в must.Ожидаете ли вы иметь более одного should дел?Это выглядит немного странно.

Что касается вашего вопроса, вы не можете использовать запрос term для анализируемого поля, но только для keyword типизированных полей.Если ваше поле EventCategory имеет сопоставление по умолчанию, вы можете выполнить запрос term для неисследованного мультиполя по умолчанию EventCategory следующим образом:

...
{
  "term": { "EventCategory.keyword": "Home Management" }
}
...

Кроме того, если вы просто хотитечтобы фильтровать входящие и исходящие документы, не заботясь об их релевантности, я бы порекомендовал переместить все условия в блоке filter, чтобы ускорить запрос и более эффективно использовать кэш.

0 голосов
/ 14 марта 2019

Ниже должен работать запрос.

Я только что удалил should и создал два must предложения по одному для каждого из event и management.Обратите внимание, что запрос предназначен для text типов данных.

{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "term":{  
                  "logLevel":"error"
               }
            },
            {  
               "match":{  
                  "EventCategory":"home"
               }
            },
            {  
               "match":{  
                  "EventCategory":"management"
               }
            }
         ],
         "filter":[  
            {  
               "range":{  
                  "timestamp":{  
                     "gte":155254550880
                  }
               }
            }
         ]
      }
   },
   "size":10,
   "from":0
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...