---
layout: default
title: Synonym graph
parent: Token filters
nav_order: 420
---
# Synonym graph token filter
The `synonym_graph` token filter is a more advanced version of the `synonym` token filter. It supports multiword synonyms and processes synonyms across multiple tokens, making it ideal for phrases or scenarios in which relationships between tokens are important.
## Parameters
The `synonym_graph` token filter can be configured with the following parameters.
Parameter | Required/Optional | Data type | Description
:--- | :--- | :--- | :---
`synonyms` | Either `synonyms` or `synonyms_path` must be specified | String | A list of synonym rules defined directly in the configuration.
`synonyms_path` | Either `synonyms` or `synonyms_path` must be specified | String | The file path to a file containing synonym rules (either an absolute path or a path relative to the config directory).
`lenient` | Optional | Boolean | Whether to ignore exceptions when loading the rule configurations. Default is `false`.
`format` | Optional | String | Specifies the format used to determine how OpenSearch defines and interprets synonyms. Valid values are:
- `solr`
- [`wordnet`](https://wordnet.princeton.edu/).
Default is `solr`.
`expand` | Optional | Boolean | Whether to expand equivalent synonym rules. Default is `true`.
For example:
If `synonyms` are defined as `"quick, fast"` and `expand` is set to `true`, then the synonym rules are configured as follows:
- `quick => quick`
- `quick => fast`
- `fast => quick`
- `fast => fast`
If `expand` is set to `false`, the synonym rules are configured as follows:
- `quick => quick`
- `fast => quick`
`synonym_analyzer` | Optional | String | The name of the analyzer that parses the synonym rules. Specify any analyzer available to the index: a built-in analyzer (such as `standard`, `simple`, `stop`, `whitespace`, or `keyword`), a language analyzer, an analyzer registered by a plugin, or a custom analyzer defined in the same index. If the named analyzer cannot be resolved, OpenSearch parses the rules using the analysis chain in which this filter is defined and returns no error. By default, the analysis chain is used.
## Example: Solr format
The following example request creates a new index named `my-index` and configures an analyzer with a `synonym_graph` filter. The filter is configured with the default `solr` rule format:
```json
PUT /my-index
{
"settings": {
"analysis": {
"filter": {
"my_synonym_graph_filter": {
"type": "synonym_graph",
"synonyms": [
"sports car, race car",
"fast car, speedy vehicle",
"luxury car, premium vehicle",
"electric car, EV"
]
}
},
"analyzer": {
"my_synonym_graph_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_graph_filter"
]
}
}
}
}
}
```
{% include copy-curl.html %}
## Generated tokens
Use the following request to examine the tokens generated using the analyzer:
```json
GET /my-car-index/_analyze
{
"analyzer": "my_synonym_graph_analyzer",
"text": "I just bought a sports car and it is a fast car."
}
```
{% include copy-curl.html %}
The response contains the generated tokens:
```json
{
"tokens": [
{"token": "i","start_offset": 0,"end_offset": 1,"type": "","position": 0},
{"token": "just","start_offset": 2,"end_offset": 6,"type": "","position": 1},
{"token": "bought","start_offset": 7,"end_offset": 13,"type": "","position": 2},
{"token": "a","start_offset": 14,"end_offset": 15,"type": "","position": 3},
{"token": "race","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 4},
{"token": "sports","start_offset": 16,"end_offset": 22,"type": "","position": 4,"positionLength": 2},
{"token": "car","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 5,"positionLength": 2},
{"token": "car","start_offset": 23,"end_offset": 26,"type": "","position": 6},
{"token": "and","start_offset": 27,"end_offset": 30,"type": "","position": 7},
{"token": "it","start_offset": 31,"end_offset": 33,"type": "","position": 8},
{"token": "is","start_offset": 34,"end_offset": 36,"type": "","position": 9},
{"token": "a","start_offset": 37,"end_offset": 38,"type": "","position": 10},
{"token": "speedy","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 11},
{"token": "fast","start_offset": 39,"end_offset": 43,"type": "","position": 11,"positionLength": 2},
{"token": "vehicle","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 12,"positionLength": 2},
{"token": "car","start_offset": 44,"end_offset": 47,"type": "","position": 13}
]
}
```
## Example: WordNet format
The following example request creates a new index named `my-wordnet-index` and configures an analyzer with a `synonym_graph` filter. The filter is configured with the [`wordnet`](https://wordnet.princeton.edu/) rule format:
```json
PUT /my-wordnet-index
{
"settings": {
"analysis": {
"filter": {
"my_synonym_graph_filter": {
"type": "synonym_graph",
"format": "wordnet",
"synonyms": [
"s(100000001, 1, 'sports car', n, 1, 0).",
"s(100000001, 2, 'race car', n, 1, 0).",
"s(100000001, 3, 'fast car', n, 1, 0).",
"s(100000001, 4, 'speedy vehicle', n, 1, 0)."
]
}
},
"analyzer": {
"my_synonym_graph_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_graph_filter"
]
}
}
}
}
}
```
{% include copy-curl.html %}
## Generated tokens
Use the following request to examine the tokens generated using the analyzer:
```json
GET /my-wordnet-index/_analyze
{
"analyzer": "my_synonym_graph_analyzer",
"text": "I just bought a sports car and it is a fast car."
}
```
{% include copy-curl.html %}
The response contains the generated tokens:
```json
{
"tokens": [
{"token": "i","start_offset": 0,"end_offset": 1,"type": "","position": 0},
{"token": "just","start_offset": 2,"end_offset": 6,"type": "","position": 1},
{"token": "bought","start_offset": 7,"end_offset": 13,"type": "","position": 2},
{"token": "a","start_offset": 14,"end_offset": 15,"type": "","position": 3},
{"token": "race","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 4},
{"token": "fast","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 4,"positionLength": 2},
{"token": "speedy","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 4,"positionLength": 3},
{"token": "sports","start_offset": 16,"end_offset": 22,"type": "","position": 4,"positionLength": 4},
{"token": "car","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 5,"positionLength": 4},
{"token": "car","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 6,"positionLength": 3},
{"token": "vehicle","start_offset": 16,"end_offset": 26,"type": "SYNONYM","position": 7,"positionLength": 2},
{"token": "car","start_offset": 23,"end_offset": 26,"type": "","position": 8},
{"token": "and","start_offset": 27,"end_offset": 30,"type": "","position": 9},
{"token": "it","start_offset": 31,"end_offset": 33,"type": "","position": 10},
{"token": "is","start_offset": 34,"end_offset": 36,"type": "","position": 11},
{"token": "a","start_offset": 37,"end_offset": 38,"type": "","position": 12},
{"token": "sports","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 13},
{"token": "race","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 13,"positionLength": 2},
{"token": "speedy","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 13,"positionLength": 3},
{"token": "fast","start_offset": 39,"end_offset": 43,"type": "","position": 13,"positionLength": 4},
{"token": "car","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 14,"positionLength": 4},
{"token": "car","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 15,"positionLength": 3},
{"token": "vehicle","start_offset": 39,"end_offset": 47,"type": "SYNONYM","position": 16,"positionLength": 2},
{"token": "car","start_offset": 44,"end_offset": 47,"type": "","position": 17}
]
}
```