Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Анализ текста ›Настройка анализа текста

Тестирование анализатора

API analyze — это незаменимый инструмент для просмотра терминов, созданных анализатором. Встроенный анализатор можно указать в запросе напрямую:

resp = client.indices.analyze(
    analyzer="whitespace",
    text="The quick brown fox.",
)
print(resp)
response = client.indices.analyze(
  body: {
    analyzer: 'whitespace',
    text: 'The quick brown fox.'
  }
)
puts response
const response = await client.indices.analyze({
  analyzer: "whitespace",
  text: "The quick brown fox.",
});
console.log(response);
POST _analyze
{
  "analyzer": "whitespace",
  "text":     "The quick brown fox."
}

API возвращает следующий ответ:

{
  "tokens": [
    {
      "token": "The",
      "start_offset": 0,
      "end_offset": 3,
      "type": "word",
      "position": 0
    },
    {
      "token": "quick",
      "start_offset": 4,
      "end_offset": 9,
      "type": "word",
      "position": 1
    },
    {
      "token": "brown",
      "start_offset": 10,
      "end_offset": 15,
      "type": "word",
      "position": 2
    },
    {
      "token": "fox.",
      "start_offset": 16,
      "end_offset": 20,
      "type": "word",
      "position": 3
    }
  ]
}

Вы также можете протестировать комбинации:

  • Токенизатора
  • Нулевых или более фильтров токенов
  • Нулевых или более фильтров символов
resp = client.indices.analyze(
    tokenizer="standard",
    filter=[
        "lowercase",
        "asciifolding"
    ],
    text="Is this déja vu?",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'standard',
    filter: [
      'lowercase',
      'asciifolding'
    ],
    text: 'Is this déja vu?'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "standard",
  filter: ["lowercase", "asciifolding"],
  text: "Is this déja vu?",
});
console.log(response);
POST _analyze
{
  "tokenizer": "standard",
  "filter":  [ "lowercase", "asciifolding" ],
  "text":      "Is this déja vu?"
}

API возвращает следующий ответ:

{
  "tokens": [
    {
      "token": "is",
      "start_offset": 0,
      "end_offset": 2,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "this",
      "start_offset": 3,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "deja",
      "start_offset": 8,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "vu",
      "start_offset": 13,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

Позиции и смещения символов

Как видно из вывода API analyze, анализаторы не только преобразуют слова в термины, но также записывают порядок или относительные позиции каждого термина (используется для запросов по фразам или запросов близости слов), а также начальное и конечное смещение символов каждого термина в исходном тексте (используется для выделения фрагментов поиска).

В качестве альтернативы можно обратиться к custom анализатору при выполнении API analyze для конкретного индекса:

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "std_folded": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "asciifolding"
                    ]
                }
            }
        }
    },
    mappings={
        "properties": {
            "my_text": {
                "type": "text",
                "analyzer": "std_folded"
            }
        }
    },
)
print(resp)

resp1 = client.indices.analyze(
    index="my-index-000001",
    analyzer="std_folded",
    text="Is this déjà vu?",
)
print(resp1)

resp2 = client.indices.analyze(
    index="my-index-000001",
    field="my_text",
    text="Is this déjà vu?",
)
print(resp2)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          std_folded: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'lowercase',
              'asciifolding'
            ]
          }
        }
      }
    },
    mappings: {
      properties: {
        my_text: {
          type: 'text',
          analyzer: 'std_folded'
        }
      }
    }
  }
)
puts response

response = client.indices.analyze(
  index: 'my-index-000001',
  body: {
    analyzer: 'std_folded',
    text: 'Is this déjà vu?'
  }
)
puts response

response = client.indices.analyze(
  index: 'my-index-000001',
  body: {
    field: 'my_text',
    text: 'Is this déjà vu?'
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        std_folded: {
          type: "custom",
          tokenizer: "standard",
          filter: ["lowercase", "asciifolding"],
        },
      },
    },
  },
  mappings: {
    properties: {
      my_text: {
        type: "text",
        analyzer: "std_folded",
      },
    },
  },
});
console.log(response);

const response1 = await client.indices.analyze({
  index: "my-index-000001",
  analyzer: "std_folded",
  text: "Is this déjà vu?",
});
console.log(response1);

const response2 = await client.indices.analyze({
  index: "my-index-000001",
  field: "my_text",
  text: "Is this déjà vu?",
});
console.log(response2);
PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_folded": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_text": {
        "type": "text",
        "analyzer": "std_folded" 
      }
    }
  }
}

GET my-index-000001/_analyze 
{
  "analyzer": "std_folded", 
  "text":     "Is this déjà vu?"
}

GET my-index-000001/_analyze 
{
  "field": "my_text", 
  "text":  "Is this déjà vu?"
}

API возвращает следующий ответ:

{
  "tokens": [
    {
      "token": "is",
      "start_offset": 0,
      "end_offset": 2,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "this",
      "start_offset": 3,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "deja",
      "start_offset": 8,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "vu",
      "start_offset": 13,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

Определите анализатор custom с именем std_folded.

Поле my_text использует анализатор std_folded.

Для обращения к этому анализатору API analyze должен указать имя индекса.

Обращайтесь к анализатору по имени.

Обращайтесь к анализатору, используемому полем my_text.

© 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/test-analyzer.html

Spec-Zone.ru

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