Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Устранение неполадок

Устранение неполадок с запросами

При запросе данных Elasticsearch может вернуть ошибку, отсутствие результатов поиска или результаты в неожиданном порядке. Это руководство описывает, как устранять неполадки в запросах.

Убедитесь, что поток данных, индекс или псевдоним существует

Elasticsearch возвращает ошибку index_not_found_exception, когда поток данных, индекс или псевдоним, который вы пытаетесь запросить, не существует. Это может произойти при ошибочном написании имени или когда данные были индексированы в другой поток данных или индекс.

Используйте API exists, чтобы проверить, существует ли поток данных, индекс или псевдоним:

resp = client.indices.exists(
    index="my-data-stream",
)
print(resp)
response = client.indices.exists(
  index: 'my-data-stream'
)
puts response
const response = await client.indices.exists({
  index: "my-data-stream",
});
console.log(response);
HEAD my-data-stream

Используйте API статистики потоков данных, чтобы перечислить все потоки данных:

resp = client.indices.data_streams_stats(
    human=True,
)
print(resp)
response = client.indices.data_streams_stats(
  human: true
)
puts response
const response = await client.indices.dataStreamsStats({
  human: "true",
});
console.log(response);
GET /_data_stream/_stats?human=true

Используйте API получения индексов, чтобы перечислить все индексы и их псевдонимы:

resp = client.indices.get(
    index="_all",
    filter_path="*.aliases",
)
print(resp)
response = client.indices.get(
  index: '_all',
  filter_path: '*.aliases'
)
puts response
const response = await client.indices.get({
  index: "_all",
  filter_path: "*.aliases",
});
console.log(response);
GET _all?filter_path=*.aliases

Вместо ошибки можно получить частичные результаты поиска, если некоторые из индексов, которые вы запрашиваете, недоступны. Установите ignore_unavailable в значение true:

resp = client.search(
    index="my-alias",
    ignore_unavailable=True,
)
print(resp)
response = client.search(
  index: 'my-alias',
  ignore_unavailable: true
)
puts response
const response = await client.search({
  index: "my-alias",
  ignore_unavailable: "true",
});
console.log(response);
GET /my-alias/_search?ignore_unavailable=true

Убедитесь, что поток данных или индекс содержит данные

Когда запрос поиска не возвращает результатов, поток данных или индекс может не содержать данных. Это может произойти из-за проблемы с загрузкой данных. Например, данные могут быть индексированы в поток данных или индекс с другим именем.

Используйте API подсчета, чтобы получить количество документов в потоке данных или индексе. Проверьте, что count в ответе не равно 0.

resp = client.count(
    index="my-index-000001",
)
print(resp)
response = client.count(
  index: 'my-index-000001'
)
puts response
const response = await client.count({
  index: "my-index-000001",
});
console.log(response);
GET /my-index-000001/_count

При отсутствии результатов поиска в Kibana проверьте, что выбран правильный вид данных и допустимый временной интервал. Также убедитесь, что вид данных настроен с правильным временным полем.

Проверьте, существует ли поле и его возможности

Запрос к полю, которого не существует, не вернет никаких результатов. Используйте API возможностей поля, чтобы проверить существование поля:

resp = client.field_caps(
    index="my-index-000001",
    fields="my-field",
)
print(resp)
response = client.field_caps(
  index: 'my-index-000001',
  fields: 'my-field'
)
puts response
const response = await client.fieldCaps({
  index: "my-index-000001",
  fields: "my-field",
});
console.log(response);
GET /my-index-000001/_field_caps?fields=my-field

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

Если поле существует, запрос вернет тип поля и информацию о том, можно ли по нему выполнять поиск и агрегацию.

{
  "indices": [
    "my-index-000001"
  ],
  "fields": {
    "my-field": {
      "keyword": {
        "type": "keyword",         
        "metadata_field": false,
        "searchable": true,        
        "aggregatable": true       
      }
    }
  }
}

Тип поля в этом индексе — keyword.

Поле доступно для поиска в этом индексе.

Поле доступно для агрегации в этом индексе.

Проверьте отображение поля

Возможности поля определяются его отображением. Чтобы получить отображение, используйте API получения отображения:

resp = client.indices.get_mapping(
    index="my-index-000001",
)
print(resp)
response = client.indices.get_mapping(
  index: 'my-index-000001'
)
puts response
const response = await client.indices.getMapping({
  index: "my-index-000001",
});
console.log(response);
GET /my-index-000001/_mappings

Если вы запрашиваете поле text, обратите внимание на анализатор, который может быть настроен. Вы можете использовать API анализа, чтобы проверить, как анализатор обрабатывает значения и поисковые термины поля:

resp = client.indices.analyze(
    index="my-index-000001",
    field="my-field",
    text="this is a test",
)
print(resp)
response = client.indices.analyze(
  index: 'my-index-000001',
  body: {
    field: 'my-field',
    text: 'this is a test'
  }
)
puts response
const response = await client.indices.analyze({
  index: "my-index-000001",
  field: "my-field",
  text: "this is a test",
});
console.log(response);
GET /my-index-000001/_analyze
{
  "field" : "my-field",
  "text" : "this is a test"
}

Чтобы изменить отображение существующего поля, обратитесь к изменению отображения поля.

Проверьте значения поля

Используйте запрос exists, чтобы проверить, есть ли документы, которые возвращают значение для поля. Проверьте, что count в ответе не равно 0.

resp = client.count(
    index="my-index-000001",
    query={
        "exists": {
            "field": "my-field"
        }
    },
)
print(resp)
response = client.count(
  index: 'my-index-000001',
  body: {
    query: {
      exists: {
        field: 'my-field'
      }
    }
  }
)
puts response
const response = await client.count({
  index: "my-index-000001",
  query: {
    exists: {
      field: "my-field",
    },
  },
});
console.log(response);
GET /my-index-000001/_count
{
  "query": {
    "exists": {
      "field": "my-field"
    }
  }
}

Если поле доступно для агрегации, вы можете использовать агрегации, чтобы проверить значения поля. Для keyword полей вы можете использовать агрегацию по частоте встречаемости для получения наиболее распространенных значений поля:

resp = client.search(
    index="my-index-000001",
    filter_path="aggregations",
    size=0,
    aggs={
        "top_values": {
            "terms": {
                "field": "my-field",
                "size": 10
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  filter_path: 'aggregations',
  body: {
    size: 0,
    aggregations: {
      top_values: {
        terms: {
          field: 'my-field',
          size: 10
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  filter_path: "aggregations",
  size: 0,
  aggs: {
    top_values: {
      terms: {
        field: "my-field",
        size: 10,
      },
    },
  },
});
console.log(response);
GET /my-index-000001/_search?filter_path=aggregations
{
  "size": 0,
  "aggs": {
    "top_values": {
      "terms": {
        "field": "my-field",
        "size": 10
      }
    }
  }
}

Для числовых полей вы можете использовать агрегацию stats, чтобы получить представление о распределении значений поля:

resp = client.search(
    index="my-index-000001",
    filter_path="aggregations",
    aggs={
        "my-num-field-stats": {
            "stats": {
                "field": "my-num-field"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  filter_path: 'aggregations',
  body: {
    aggregations: {
      "my-num-field-stats": {
        stats: {
          field: 'my-num-field'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  filter_path: "aggregations",
  aggs: {
    "my-num-field-stats": {
      stats: {
        field: "my-num-field",
      },
    },
  },
});
console.log(response);
GET my-index-000001/_search?filter_path=aggregations
{
  "aggs": {
    "my-num-field-stats": {
      "stats": {
        "field": "my-num-field"
      }
    }
  }
}

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

Проверьте последнее значение

Для временных рядов данных убедитесь, что есть нефильтрованные данные в заданном временном интервале. Например, если вы пытаетесь запросить последние данные для поля @timestamp, запустите следующий запрос, чтобы увидеть, попадает ли максимальное значение @timestamp в заданный интервал:

resp = client.search(
    index="my-index-000001",
    sort="@timestamp:desc",
    size="1",
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  sort: '@timestamp:desc',
  size: 1
)
puts response
const response = await client.search({
  index: "my-index-000001",
  sort: "@timestamp:desc",
  size: 1,
});
console.log(response);
GET my-index-000001/_search?sort=@timestamp:desc&size=1

Проверка, объяснение и профилирование запросов

Когда запрос возвращает неожиданные результаты, Elasticsearch предоставляет несколько инструментов для выяснения причины.

API валидации позволяет валидировать запрос. Используйте параметр rewrite, чтобы получить Lucene-запрос, в который преобразуется запрос Elasticsearch:

resp = client.indices.validate_query(
    index="my-index-000001",
    rewrite=True,
    query={
        "match": {
            "user.id": {
                "query": "kimchy",
                "fuzziness": "auto"
            }
        }
    },
)
print(resp)
response = client.indices.validate_query(
  index: 'my-index-000001',
  rewrite: true,
  body: {
    query: {
      match: {
        'user.id' => {
          query: 'kimchy',
          fuzziness: 'auto'
        }
      }
    }
  }
)
puts response
const response = await client.indices.validateQuery({
  index: "my-index-000001",
  rewrite: "true",
  query: {
    match: {
      "user.id": {
        query: "kimchy",
        fuzziness: "auto",
      },
    },
  },
});
console.log(response);
GET /my-index-000001/_validate/query?rewrite=true
{
  "query": {
    "match": {
      "user.id": {
        "query": "kimchy",
        "fuzziness": "auto"
      }
    }
  }
}

Используйте API объяснения, чтобы понять, почему определённый документ соответствует или не соответствует запросу:

resp = client.explain(
    index="my-index-000001",
    id="0",
    query={
        "match": {
            "message": "elasticsearch"
        }
    },
)
print(resp)
response = client.explain(
  index: 'my-index-000001',
  id: 0,
  body: {
    query: {
      match: {
        message: 'elasticsearch'
      }
    }
  }
)
puts response
const response = await client.explain({
  index: "my-index-000001",
  id: 0,
  query: {
    match: {
      message: "elasticsearch",
    },
  },
});
console.log(response);
GET /my-index-000001/_explain/0
{
  "query" : {
    "match" : { "message" : "elasticsearch" }
  }
}

API профилирования предоставляет подробную информацию о времени выполнения запроса поиска. Для визуального представления результатов используйте Профилировщик поиска в Kibana.

Чтобы устранить неполадки с запросами в Kibana, выберите Просмотреть в панели инструментов. Затем выберите Запрос. Теперь вы можете скопировать запрос, отправленный Kibana в Elasticsearch, для дальнейшего анализа в Консоли.

Проверка настроек индекса

Настройки индекса могут влиять на результаты поиска. Например, настройка index.query.default_field, которая определяет поле, по которому выполняется запрос, если в запросе не указано явное поле. Используйте API получения настроек индекса, чтобы получить настройки индекса:

resp = client.indices.get_settings(
    index="my-index-000001",
)
print(resp)
response = client.indices.get_settings(
  index: 'my-index-000001'
)
puts response
const response = await client.indices.getSettings({
  index: "my-index-000001",
});
console.log(response);
GET /my-index-000001/_settings

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

Для статических настроек вам необходимо создать новый индекс с правильными настройками. Затем вы можете повторно индексировать данные в этот индекс. Для потоков данных см. Изменение статической настройки индекса для потока данных.

Поиск медленных запросов

Журналы медленных запросов могут помочь определить медленные запросы поиска. Включение журналирования аудита сверху может помочь определить источник запроса. Добавьте следующие настройки в файл конфигурации elasticsearch.yml для отслеживания запросов. Полученное журналирование подробное, поэтому отключите эти настройки, когда не проводите устранение неполадок.

xpack.security.audit.enabled: true
xpack.security.audit.logfile.events.include: _all
xpack.security.audit.logfile.events.emit_request_body: true

Дополнительную информацию см. в статье Расширенная настройка: поиск и устранение медленных запросов Elasticsearch.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/troubleshooting-searches.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API