У меня есть таблица с данными, которые можно редактировать, body и body_edited. Когда содержимое добавляется в таблицу, поле body всегда присутствует, а body_edited имеет значение NULL. body_edited предназначен для небольшой части контента, который потенциально будет изменен в будущем и будет использоваться для общедоступного контента с сохранением оригинала.

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

Поле body будет сохранено по устаревшим причинам. Создание третьего поля при импорте данных из SQL было предложено в качестве опции, но это существенно увеличит объем пространства, необходимого для хранения.

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

1
ssb 11 Сен 2018 в 13:03

1 ответ

Лучший ответ

Этого можно добиться с помощью предложений should и exists. Предположим, у вас есть два следующих документа:

// Document 1
{
  "body": "quick brown fox",
  "body_edited": null
}

// Document 2
{
  "body": "quick brown fox",
  "body_edited": "jumps over the lazy dog"
}

Вот пример поискового запроса по запросу «коричневая лиса»:

"query": {
  "bool": {
    "should": [
      {
        "match": {
          "body_edited": "brown fox"
        }
      },
      {
        "bool": {
          "must": {
            "match": {
              "body": "brown fox"
            }
          },
          "must_not": {
            "exists": {
              "field": "body_edited"
            }
          }
        }
      }
    ]
  }
}

Этот запрос вернет только первый документ, несмотря на то, что поле body в документе 2 также соответствует нашим критериям поиска.

2
briarheart 11 Сен 2018 в 12:58