Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›REST API ›API синонимов

Создание или обновление набора синонимов

Справочник по новым API

Для получения самых актуальных данных об API, обратитесь к API синонимов.

Создает или обновляет набор синонимов.

Наборы синонимов ограничены максимальным числом 10 000 правил синонимии на набор. Если вам нужно управлять большим количеством правил синонимии, вы можете создать несколько наборов синонимов.

Запрос

PUT _synonyms/<synonyms_set>

Предварительные условия

Требуется привилегия кластера manage_search_synonyms.

Параметры пути

<synonyms_set>
(Обязательно, строка) Идентификатор набора синонимов для создания. Этот идентификатор будет использоваться другими API синонимов для управления набором синонимов.

Тело запроса

synonyms_set
(Обязательно, массив объектов правил синонимии) Определения правил синонимии для набора синонимов.
Свойства объектов synonyms_set
id
(Необязательно, строка) Идентификатор, связанный с правилом синонимии, который можно использовать для управления отдельными правилами синонимии с помощью API правил синонимии. Если идентификатор правила синонимии не указан, Elasticsearch автоматически создаст его.
synonyms

(Обязательно, строка) Правило синонимии. Оно должно быть в формате Solr. Вот несколько примеров:

  • "i-pod, i pod ⇒ ipod",
  • "universe, cosmos"

Примеры

В следующем примере создается новый набор синонимов под названием my-synonyms-set:

resp = client.synonyms.put_synonym(
    id="my-synonyms-set",
    synonyms_set=[
        {
            "id": "test-1",
            "synonyms": "hello, hi"
        },
        {
            "synonyms": "bye, goodbye"
        },
        {
            "id": "test-2",
            "synonyms": "test => check"
        }
    ],
)
print(resp)
response = client.synonyms.put_synonym(
  id: 'my-synonyms-set',
  body: {
    synonyms_set: [
      {
        id: 'test-1',
        synonyms: 'hello, hi'
      },
      {
        synonyms: 'bye, goodbye'
      },
      {
        id: 'test-2',
        synonyms: 'test => check'
      }
    ]
  }
)
puts response
const response = await client.synonyms.putSynonym({
  id: "my-synonyms-set",
  synonyms_set: [
    {
      id: "test-1",
      synonyms: "hello, hi",
    },
    {
      synonyms: "bye, goodbye",
    },
    {
      id: "test-2",
      synonyms: "test => check",
    },
  ],
});
console.log(response);
PUT _synonyms/my-synonyms-set
{
  "synonyms_set": [
    {
      "id": "test-1",
      "synonyms": "hello, hi"
    },
    {
      "synonyms": "bye, goodbye"
    },
    {
      "id": "test-2",
      "synonyms": "test => check"
    }
  ]
}

Если какое-либо из правил синонимии некорректно, API вернёт ошибку.

resp = client.synonyms.put_synonym(
    id="my-synonyms-set",
    synonyms_set=[
        {
            "synonyms": "hello => hi => howdy"
        }
    ],
)
print(resp)
const response = await client.synonyms.putSynonym({
  id: "my-synonyms-set",
  synonyms_set: [
    {
      synonyms: "hello => hi => howdy",
    },
  ],
});
console.log(response);
PUT _synonyms/my-synonyms-set
{
  "synonyms_set": [
    {
      "synonyms": "hello => hi => howdy"
    }
  ]
}
{
  "error": {
    "root_cause": [
      {
        "type": "action_request_validation_exception",
        "reason": "Validation Failed: 1: More than one explicit mapping specified in the same synonyms rule: [hello => hi => howdy];",
        "stack_trace": ...
      }
    ],
    "type": "action_request_validation_exception",
    "reason": "Validation Failed: 1: More than one explicit mapping specified in the same synonyms rule: [hello => hi => howdy];",
    "stack_trace": ...
  },
  "status": 400
}

Перезагрузка анализатора

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

Например, создание индекса с набором синонимов и его обновление:

resp = client.synonyms.put_synonym(
    id="my-synonyms-set",
    synonyms_set=[
        {
            "id": "test-1",
            "synonyms": "hello, hi"
        }
    ],
)
print(resp)

resp1 = client.indices.create(
    index="test-index",
    settings={
        "analysis": {
            "filter": {
                "synonyms_filter": {
                    "type": "synonym_graph",
                    "synonyms_set": "my-synonyms-set",
                    "updateable": True
                }
            },
            "analyzer": {
                "my_index_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase"
                    ]
                },
                "my_search_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "synonyms_filter"
                    ]
                }
            }
        }
    },
    mappings={
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "my_index_analyzer",
                "search_analyzer": "my_search_analyzer"
            }
        }
    },
)
print(resp1)

resp2 = client.synonyms.put_synonym(
    id="my-synonyms-set",
    synonyms_set=[
        {
            "id": "test-1",
            "synonyms": "hello, hi, howdy"
        }
    ],
)
print(resp2)
response = client.synonyms.put_synonym(
  id: 'my-synonyms-set',
  body: {
    synonyms_set: [
      {
        id: 'test-1',
        synonyms: 'hello, hi'
      }
    ]
  }
)
puts response

response = client.indices.create(
  index: 'test-index',
  body: {
    settings: {
      analysis: {
        filter: {
          synonyms_filter: {
            type: 'synonym_graph',
            synonyms_set: 'my-synonyms-set',
            updateable: true
          }
        },
        analyzer: {
          my_index_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'lowercase'
            ]
          },
          my_search_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'lowercase',
              'synonyms_filter'
            ]
          }
        }
      }
    },
    mappings: {
      properties: {
        title: {
          type: 'text',
          analyzer: 'my_index_analyzer',
          search_analyzer: 'my_search_analyzer'
        }
      }
    }
  }
)
puts response

response = client.synonyms.put_synonym(
  id: 'my-synonyms-set',
  body: {
    synonyms_set: [
      {
        id: 'test-1',
        synonyms: 'hello, hi, howdy'
      }
    ]
  }
)
puts response
const response = await client.synonyms.putSynonym({
  id: "my-synonyms-set",
  synonyms_set: [
    {
      id: "test-1",
      synonyms: "hello, hi",
    },
  ],
});
console.log(response);

const response1 = await client.indices.create({
  index: "test-index",
  settings: {
    analysis: {
      filter: {
        synonyms_filter: {
          type: "synonym_graph",
          synonyms_set: "my-synonyms-set",
          updateable: true,
        },
      },
      analyzer: {
        my_index_analyzer: {
          type: "custom",
          tokenizer: "standard",
          filter: ["lowercase"],
        },
        my_search_analyzer: {
          type: "custom",
          tokenizer: "standard",
          filter: ["lowercase", "synonyms_filter"],
        },
      },
    },
  },
  mappings: {
    properties: {
      title: {
        type: "text",
        analyzer: "my_index_analyzer",
        search_analyzer: "my_search_analyzer",
      },
    },
  },
});
console.log(response1);

const response2 = await client.synonyms.putSynonym({
  id: "my-synonyms-set",
  synonyms_set: [
    {
      id: "test-1",
      synonyms: "hello, hi, howdy",
    },
  ],
});
console.log(response2);
PUT _synonyms/my-synonyms-set
{
    "synonyms_set": [
        {
            "id": "test-1",
            "synonyms": "hello, hi"
        }
    ]
}

PUT /test-index
{
  "settings": {
    "analysis": {
      "filter": {
        "synonyms_filter": {
          "type": "synonym_graph",
          "synonyms_set": "my-synonyms-set",
          "updateable": true
        }
      },
      "analyzer": {
        "my_index_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase"]
        },
        "my_search_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "synonyms_filter"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "my_index_analyzer",
        "search_analyzer": "my_search_analyzer"
      }
    }
  }
}

PUT _synonyms/my-synonyms-set
{
    "synonyms_set": [
        {
            "id": "test-1",
            "synonyms": "hello, hi, howdy"
        }
    ]
}

Результат перезагрузки включён в ответ:

{
  "result": "updated",
  "reload_analyzers_details": {
    "_shards": {
      "total": 2,
      "successful": 1,
      "failed": 0
    },
    "reload_details": [
      {
        "index": "test-index",
        "reloaded_analyzers": [
          "my_search_analyzer"
        ],
        "reloaded_node_ids": [
          "1wYFZzq8Sxeu_Jvt9mlbkg"
        ]
      }
    ]
  }
}

© 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/put-synonyms-set.html

Spec-Zone.ru

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