Как отфильтровать запрос по значению поля - PullRequest
0 голосов
/ 10 октября 2019

Я работаю сasticsearch Query dsl и не могу найти способ выразить следующее:

Вернуть результаты, которые имеют поле "price" > min budget и имеют "цену" <макс. Бюджет и имеют<code>has_price=true, а также возвращает все результаты с "has_price=false"

Другими словами, я хотел бы использовать фильтр диапазона только для результатов, для которых в поле has_price установлено значение true, в противном случае - для результатов, для которых установлено значение has_price. в false не принимать во внимание фильтр

Вот отображение:

{
  "formations": {
    "mappings": {
      "properties": {
        "code": {
          "type": "text"
        },
        "date": {
          "type": "date",
          "format": "dd/MM/yyyy"
        },
        "description": {
          "type": "text"
        },
        "has_price": {
          "type": "boolean"
        },
        "place": {
          "type": "text"
        },
        "price": {
          "type": "float"
        },
        "title": {
          "type": "text"
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 10 октября 2019

Следующий запрос объединяет 2 сценария в виде 2 must в запросе bool . И так как есть только предложения must, minimum_should_match будет равен 1, что означает, что должен совпадать хотя бы один пункт should:

Фрагмент абстрактного кода

GET formations/_search
{
  "query": {
    "bool": {
      "should": [
        { <1st scenario: has_price = false> },
        { <2nd scenario> has_price = true AND price IN budget_range}
      ]
    }
  }
}

Фактические фрагменты кода образца

# 1. Create the index and populate it with some sample documents

POST formations/_bulk
{"index": {"_id": 1}}
{"has_price": true, "price": 2.0}
{"index": {"_id": 2}}
{"has_price": true, "price": 3.0}
{"index": {"_id": 3}}
{"has_price": true, "price": 4.0}
{"index": {"_id": 4}}
{"has_price": false, "price": 2.0}
{"index": {"_id": 5}}
{"has_price": false, "price": 3.0}
{"index": {"_id": 6}}
{"has_price": false, "price": 4.0}

# 2. Query assuming min_budget = 2.0 and max_budget = 4.0

GET formations/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": {
              "term": {
                "has_price": false
              }
            }
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "has_price": true
                }
              },
              {
                "range": {
                  "price": {
                    "gt": 2,
                    "lt": 4
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

# 3. Result Snippet (4 hits: 3 from 1st scenario & 1 from 2nd scenario)
"hits" : {
  "total" : {
    "value" : 4,
      "relation" : "eq"
    },
    ...

Не забудьте добавить Claus "minimum_should_match": 1 в ваш bool-запрос на случай, если вы добавите еще один необязательный пункт в свой bool-query.

Дайте мне знать, если это ответит на ваш вопрос и решит вашу проблему.

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