Flatten graph token filter
editFlatten graph token filter
editFlattens a token graph produced by a graph token filter, such
as synonym_graph
or
word_delimiter_graph
.
Flattening a token graph containing multi-position tokens makes the graph suitable for indexing. Otherwise, indexing does not support token graphs containing multi-position tokens.
Flattening graphs is a lossy process.
If possible, avoid using the flatten_graph
filter. Instead, use graph token
filters in search analyzers only. This eliminates
the need for the flatten_graph
filter.
The flatten_graph
filter uses Lucene’s
FlattenGraphFilter.
Example
editTo see how the flatten_graph
filter works, you first need to produce a token
graph containing multi-position tokens.
The following analyze API request uses the synonym_graph
filter to add dns
as a multi-position synonym for domain name system
in the
text domain name system is fragile
:
response = client.indices.analyze( body: { tokenizer: 'standard', filter: [ { type: 'synonym_graph', synonyms: [ 'dns, domain name system' ] } ], text: 'domain name system is fragile' } ) puts response
GET /_analyze { "tokenizer": "standard", "filter": [ { "type": "synonym_graph", "synonyms": [ "dns, domain name system" ] } ], "text": "domain name system is fragile" }
The filter produces the following token graph with dns
as a multi-position
token.
Indexing does not support token graphs containing multi-position tokens. To make this token graph suitable for indexing, it needs to be flattened.
To flatten the token graph, add the flatten_graph
filter after the
synonym_graph
filter in the previous analyze API request.
response = client.indices.analyze( body: { tokenizer: 'standard', filter: [ { type: 'synonym_graph', synonyms: [ 'dns, domain name system' ] }, 'flatten_graph' ], text: 'domain name system is fragile' } ) puts response
GET /_analyze { "tokenizer": "standard", "filter": [ { "type": "synonym_graph", "synonyms": [ "dns, domain name system" ] }, "flatten_graph" ], "text": "domain name system is fragile" }
The filter produces the following flattened token graph, which is suitable for indexing.
Add to an analyzer
editThe following create index API request uses the
flatten_graph
token filter to configure a new
custom analyzer.
In this analyzer, a custom word_delimiter_graph
filter produces token graphs
containing catenated, multi-position tokens. The flatten_graph
filter flattens
these token graphs, making them suitable for indexing.
response = client.indices.create( index: 'my-index-000001', body: { settings: { analysis: { analyzer: { my_custom_index_analyzer: { type: 'custom', tokenizer: 'standard', filter: [ 'my_custom_word_delimiter_graph_filter', 'flatten_graph' ] } }, filter: { my_custom_word_delimiter_graph_filter: { type: 'word_delimiter_graph', catenate_all: true } } } } } ) puts response
PUT /my-index-000001 { "settings": { "analysis": { "analyzer": { "my_custom_index_analyzer": { "type": "custom", "tokenizer": "standard", "filter": [ "my_custom_word_delimiter_graph_filter", "flatten_graph" ] } }, "filter": { "my_custom_word_delimiter_graph_filter": { "type": "word_delimiter_graph", "catenate_all": true } } } } }