Поиск данных в OpenSearch

OpenSearch предлагает несколько методов поиска: Query DSL, Query string, SQL, PPL, DQL

OpenSearch предлагает несколько методов поиска:

  1. Query DSL - основной язык запросов для сложных поисковых сценариев
  2. Query string - упрощённый синтаксис для параметров запроса
  3. SQL - традиционный язык запросов для реляционных данных
  4. PPL (Piped Processing Language) - язык для задач observability
  5. DQL (Dashboards Query Language) - текстовый язык фильтрации в Dashboards

Подготовка данных

Перед началом загрузим тестовые данные о студентах:

POST _bulk
{ "create": { "_index": "students", "_id": "1" } }
{ "name": "Иван Петров", "gpa": 4.5, "grad_year": 2023}
{ "create": { "_index": "students", "_id": "2" } }
{ "name": "Алексей Смирнов", "gpa": 4.2, "grad_year": 2025 }
{ "create": { "_index": "students", "_id": "3" } }
{ "name": "Мария Иванова", "gpa": 4.8, "grad_year": 2024 }

Базовые запросы

Получение всех документов:

GET /students/_search

Эквивалентно:

GET /students/_search
{
  "query": { "match_all": {} }
}

Структура ответа:

  • took - время выполнения (мс)
  • timed_out - флаг превышения таймаута
  • _shards - статистика по шардам
  • hits - результаты поиска:
    • total - общее количество совпадений
    • max_score - максимальная релевантность
    • hits - массив документов с оценкой релевантности

Query string поиск

Пример поиска по имени:

GET /students/_search?q=name:john

вернет ответ:

{
  "took": 18,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.9808291,
    "hits": [
      {
        "_index": "students",
        "_id": "1",
        "_score": 0.9808291,
        "_source": {
          "name": "John Doe",
          "grade": 12,
          "gpa": 3.89,
          "grad_year": 2022,
          "future_plans": "John plans to be a computer science major"
        }
      }
    ]
  }
}

Полнотекстовый поиск (Query DSL)

Поиск с анализом текста:

GET /students/_search
{
  "query": {
    "match": {
      "name": "иван"  # Найдёт "Иван Петров" и "Мария Иванова"
    }
  }
}
{
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.9808291,
    "hits": [
      {
        "_index": "students",
        "_id": "1",
        "_score": 0.9808291,
        "_source": {
          "name": "Иван Петров",
          "gpa": 3.89,
          "grad_year": 2022
        }
      }
    ]
  }
}

Поиск по ключевым словам

Точное совпадение (без анализа):

GET /students/_search
{
  "query": {
    "match": {
      "name.keyword": "john doe"  # Только полное совпадение
    }
  }
}
{
  "took": 19,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.9808291,
    "hits": [
      {
        "_index": "students",
        "_id": "1",
        "_score": 0.9808291,
        "_source": {
          "name": "John Doe",
          "gpa": 3.89,
          "grad_year": 2022
        }
      }
    ]
  }
}

Фильтры

Точное значение:

GET students/_search
{
  "query": { 
    "bool": { 
      "filter": [ 
        { "term":  { "grad_year": 2023 }}
      ]
    }
  }
}

Диапазон значений:

GET students/_search
{
  "query": { 
    "bool": { 
      "filter": [ 
        { "range": { "gpa": { "gt": 4.0 }}}
      ]
    }
  }
}

Составные запросы

Комбинация условий:

GET students/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "иван" } },
        { "range": { "gpa": { "gte": 4.0 } } },
        { "term":  { "grad_year": 2023 }}
      ]
    }
  }
}

Расширенные возможности

OpenSearch поддерживает современные методы поиска:

  • k-NN (поиск ближайших соседей)
  • Семантический поиск
  • Мультимодальный поиск
  • Гибридный поиск

Дополнительные материалы