У меня есть документы в индексе Elasticsearch со следующей структурой:

{
  "title": 'Nutrtional facts',
  "begin_timestamp" : 1582686052,
  "end_timestamp" : 1582686093
}

{
  "title": 'Guitar facts',
  "begin_timestamp" : 1447991100,
  "end_timestamp" : 1447994100
}

{
  "title": 'Hair style facts',
  "begin_timestamp" : 1447991100,
  "end_timestamp" : 1447994100
}

{
  "title": 'Piano facts',
  "begin_timestamp" : 1554416211,
  "end_timestamp" : 1591308724
}

Я собираюсь получить документы, заголовок которых совпадает с facts и если начальная или конечная метка времени больше текущей даты и времени.

title matches `facts` && begin_timestamp > CURRENT_DATE_TIME OR end_timestamp > CURRENT_DATE_TIME

Текущий запрос, который я выполняю, выглядит следующим образом:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "facts"
          }
        }
      ],
      "should": [
        {
          "range": {
            "begin_timestamp_for_search": {
              "gte": 1580853917
            }
          }
        },
        {
          "range": {
            "begin_timestamp_for_search": {
              "gte": 1580853917
            }
          }
        }
      ]
    }
  }
}

Это, однако, совпадает со всем, что совпадает с facts, и возвращает все документы независимо от отметок времени до или после текущей даты и времени. Я довольно новичок в ES, и мне интересно, как я мог бы написать запрос, чтобы единственные документы, которые возвращались, были:

{
  "title": 'Nutrtional facts',
  "begin_timestamp" : 1582686052,
  "end_timestamp" : 1582686093
}

{
  "title": 'Piano facts',
  "begin_timestamp" : 1570227141,
  "end_timestamp" : 1591308724
}
0
Arthur 5 Фев 2020 в 01:28

3 ответа

Лучший ответ

В ваших фрагментах кода есть несколько мелких опечаток, и вам нужно обернуть ваше should - предложение в другой bool - запрос, который вы добавляете / перемещаете в свое обязательное предложение.

Решение (проверено с помощью ES 7.5.x)

POST my_index/_bulk
{"index": {}}
{"title": "Nutrtional facts", "begin_timestamp": 1582686052, "end_timestamp": 1582686093}
{"index": {}}
{"title": "Guitar facts", "begin_timestamp": 1447991100, "end_timestamp": 1447994100}
{"index": {}}
{"title": "Hair style facts", "begin_timestamp": 1447991100, "end_timestamp": 1447994100}
{"index": {}}
{"title": "Piano facts", "begin_timestamp": 1554416211, "end_timestamp": 1591308724}


GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"title": "facts"}},
        {"bool": {
          "should": [
            {"range": {"begin_timestamp": {"gte": 1580853917}}},
            {"range": {"end_timestamp": {"gte": 1580853917}}}
          ]
        }}
      ]
    }
  }
}

Комментарий 1 . Приведенный выше фрагмент кода решения исправляет опечатки в фрагментах кода:

  • используя разные имена полей в документах и в запросе
  • оба запроса к одному и тому же begin_timestamp - полю

Комментарий 2: "minimum_should_match": 1 не требуется, поскольку это поведение по умолчанию bool - запроса, состоящего только из should - предложений.

Типп : лучше всего смоделировать ваши метки времени как поля типа date. Это позволяет вам использовать математику даты (например, now в ваших запросах). Внутренне Elasticsearch будет хранить ваши даты как epoch_in_millis.

0
Daniel Schneiter 4 Фев 2020 в 23:17
  1. Ваш запрос имеет неправильные имена - например, begin_timestamp_for_search должно быть begin_timestamp в соответствии с вашими документами
  2. Вам необходимо установить для параметра minimum_should_match значение 1, так как требуется, чтобы было выполнено хотя бы одно условие should (ссылка на документацию Elastic)

Поэтому ваш запрос должен выглядеть примерно так:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "facts"
          }
        }
      ],
      "should": [
        {
          "range": {
            "begin_timestamp": {
              "gte": 1580853917
            }
          }
        },
        {
          "range": {
            "end_timestamp": {
              "gte": 1580853917
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}
0
glenacota 4 Фев 2020 в 23:01
{
    "from": 0,
    "size": 200,
    "query": {
        "bool": {
            "filter": [
                {
                    "bool": {
                        "must": [
                            {
                                "bool": {
                                    "must": [
                                        {
                                            "wildcard": {
                                                "title": {
                                                    "wildcard": "*facts*",
                                                    "boost": 1
                                                }
                                            }
                                        },
                                        {
                                            "bool": {
                                                "should": [
                                                    {
                                                        "range": {
                                                            "begin_timestamp": {
                                                                "from": 1580853917,
                                                                "to": null,
                                                                "include_lower": false,
                                                                "include_upper": true,
                                                                "boost": 1
                                                            }
                                                        }
                                                    },
                                                    {
                                                        "range": {
                                                            "end_timestamp": {
                                                                "from": 1580853917,
                                                                "to": null,
                                                                "include_lower": false,
                                                                "include_upper": true,
                                                                "boost": 1
                                                            }
                                                        }
                                                    }
                                                ],
                                                "adjust_pure_negative": true,
                                                "boost": 1
                                            }
                                        }
                                    ],
                                    "adjust_pure_negative": true,
                                    "boost": 1
                                }
                            }
                        ],
                        "adjust_pure_negative": true,
                        "boost": 1
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    }
}

0
YouXiang-Wang 4 Фев 2020 в 22:50