Elasticsearch - Как объединить запросы «И» и «ИЛИ», чтобы получить результаты обоих? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь использовать один запрос, чтобы получить результаты двух запросов.

В настоящее время мне нужно выполнить два запроса для каждого запроса запроса из нескольких слов, а затем программно объединить результаты в коде, который мне не подходит.

В одном из запросов используется оператор AND, в одном из них используется оператор OR.

Вот первый запрос:

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"exists": {"field": "deleted"}}
      ],
      "must": [
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "AND"
          }
        }
      ],
      "filter": [
        {"term": {"kind": "article"}},
        {"term": {"status": "published"}}
      ]
    }
  }
}

А вот и второй запрос:

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"exists": {"field": "deleted"}}
      ],
      "must": [
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "OR"
          }
        }
      ],
      "filter": [
        {"term": {"kind": "article"}},
        {"term": {"status": "published"}}
      ]
    }
  }
}

Идея состоит в том, чтобы получить результаты первого запроса (запрос, который использует оператор AND) в top , а затем получить результаты второго запроса (запрос, который использует OR оператор) ниже первые результаты.

Есть ли способ добиться этого с помощью одного запроса вместо двух?

1 Ответ

0 голосов
/ 09 января 2019

Возможно, вы можете использовать bool/should с более высоким коэффициентом boost для совпадений AND:

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "deleted"
          }
        }
      ],
      "minimum_should_match": 1,
      "should": [
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "AND",
            "boost": 2,                   <--- boost AND by 2 (or more)
            "_name": "and-match"
          }
        },
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "OR",
            "_name": "or-match"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "kind": "article"
          }
        },
        {
          "term": {
            "status": "published"
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...