Elasticsearch возвращает результаты больше, чем указано в диапазоне - PullRequest
0 голосов
/ 17 января 2020

Я использую Elasticsearch (Версия: 6.8.4) с MongoDB (4.0.3)

Я хочу найти все документы, где цена между 1 и 800, а sale_date больше Date.now (), но у меня проблема с моим запросом:

{
  "query": {
    "bool": {
      "must": [],
      "filter": {
        "term": { 
          "sold_out": false 
        },
        "bool": {
          "should": [
            {
              "range": {
                "sale_date": {
                  "gt": Date.now()
                }
              }
            },
            {
              "range": {
                "price": {
                  "gt": 1,
                  "lte": 800
                }
              }
            }
          ]
        }
      }
    }
  },
  "from": 10,
  "size": 200
}

Этот запрос возвращает мне результаты с продуктами, некоторые из которых имеют цену выше 800

Поле цены хранится в Elasticsearch как long

Что я пытаюсь:

  • использовать от: до: и получил те же результаты
  • в фильтре заменить "must" на "must", и он возвращает пустые результаты
  • удалить из запроса {"range": {"sale_date": {"gt": Date.now (),}}} и он возвращает право результаты!

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 17 января 2020

Сначала удалите ненужное вложение двух объектов bool, попробуйте поместить все предложения в одно и то же поле "bool", как это.

Помните, что с должен документ должен иметь термин Вы сравниваете, чтобы быть включенным в результат, с должен совпадение только улучшит счет, если условие выполнено, поэтому в определенном смысле должен походить на AND и должен быть похож на ИЛИ .

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

Попробуйте это:

{
  "query": {
    "bool": {
      "must": [{
        "range": {
          "sale_date": {
            "gt": Date.now()
          }
        }
      },
      {
        "range": {
          "price": {
            "gt": 1,
            "lte": 800
          }
        }
      }],
        "filter": {
        "term": {
          "sold_out": false
        },
      }
    }
  },
  "from": 10,
  "size": 200
}

Это позволит получить только элементы с ценой lte 800 и sale_date gt Date.now ().

0 голосов
/ 17 января 2020

Изменить дату (). Now () на "gt": "now / d".

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