Elasticsearch: фильтровать результаты на основе диапазона дат - PullRequest
3 голосов
/ 21 сентября 2019

Я использую Elasticsearch 6.6, пытаясь извлечь несколько результатов / записей на основе нескольких значений (email_address), переданных в запрос (Bool) в диапазоне дат.Например: я хочу получить информацию о нескольких сотрудниках на основе их адреса электронной почты (annie@test.com, charles@test.com, heman@test.com) и периода, т.е. project_date (2019-01-01).

Я использовал выражение if, но, к сожалению, он извлекает все записи из эластичного поиска на основе диапазона дат, т. Е. Даже извлекает информацию о других сотрудниках из project_date 2019-01-01.

{

  "query": {

    "bool": {

      "should": [

        { "match": { "email_address":   "annie@test.com"        }},

        { "match": { "email_address":   "chalavadi@test.com"        }}

      ],

      "filter": [

        { "range": { "project_date": { "gte": "2019-08-01" }}}

      ]

    }

  }

}

Iтакже пытался выражение, но не получая результата.Не могли бы вы помочь мне в поиске сотрудников, используя их адрес электронной почты с диапазоном дат?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Вы можете сделать это с помощью terms и range вместе с существующим запросом внутри filter более коротким способом.Ваш существующий запрос не работает должным образом из-за предложения should, он делает ваш filter более слабым. Подробнее здесь:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

{
 "query": { 
 "bool": { 
   "filter": [ 
     {
          "terms": {
            "email_address.keyword": [
              "annie@test.com", "chalavedi@test.com"
            ]
          }
      },
      {
          "range": {
            "project_date": {
              "gte": "2019-08-01"
            }
          }
       }
    ]
   }
  }
}
0 голосов
/ 22 сентября 2019

Если (или) предложения являются необязательными

Цитирование из этой статьи.«В запросе, если присутствуют запросы must и filter, вхождение запроса следует тогда влиять на оценку. Однако, если запрос bool находится в контексте фильтра или не имеет ни запроса, ни фильтра, то по крайней мере один из запросов mustдолжен соответствовать документу. "

Таким образом, ваш запрос должен влиять только на оценку, а не на фильтрацию документа.Вы должны завернуть в обязательное или перенести его в фильтр (если оценка не требуется).

GET employeeindex/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "projectdate": {
            "gte": "2019-01-01"
          }
        }
      },
      "must": [
        {
          "bool": {
            "should": [
              {
                "term": {
                  "email.raw": "abc@text.com"
                }
              },
              {
                "term": {
                  "email.raw": "efg@text.com"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Вы также можете заменить предложение must на условие терминов, как в ответе @ AlwaysSunny.

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