Фильтрация результатов поиска Elasti c с обязательным и совпадением дает неожиданный результат - PullRequest
0 голосов
/ 07 мая 2020
{
  "body": {
    "query": {
      "bool": {
        "must": {
          "match": {
            "_id": "24"
          }
        },
        "should": [
          {
            "term": {
              "draft_id": "draft_11"
            }
          },
          {
            "term": {
              "draft_id": "non_draft"
            }
          }
        ]
      }
    }
  }
}

результат содержит информацию ниже

{
  "_id": "24",
  "name": "xyz",
  "draft_id": "draft_312"
}

Требование

Я хочу отфильтровать запись на основе:

  • id должен соответствовать
  • И draft_id должен быть либо non_draft, либо draft_11

ИЛИ простыми словами

id = 24 AND (draft_id = "non_draft" OR draft_id = "draft_11")

И если вы видите результат, он совпадает только с id, но не с полем draft_id.

1 Ответ

2 голосов
/ 07 мая 2020

Вам нужно переместить предложение should внутрь must_clause. Только предложения в должны иметь "И" между собой

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "_id": "24"
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
              "draft_id": "draft_11"
            }
              },
              {
             "term": {
              "draft_id": "draft_11"
            }   
              }
            ]
          }
        },
        {
          "query_string": {
            "default_field": "FIELD",
            "query": "this AND that OR thus"
          }
        }
      ]
    }
  }
}
...