Oi @lucianocarvalho,
Eu não entendi muito bem sua pergunta mas vou tentar explicar como os sinônimos funcionam na tentativa de te ajudar.
Para utilizar os sinônimos devemos, ao criar um índice, definir um analyzer que possua um filter do tipo synonym
. Esse filtro será responsável por mapear todos os sinônimos. Por exemplo:
PUT /teste_sinonimos
{
"settings": {
"analysis": {
"filter": {
"portuguese_stop": {
"type": "stop",
"stopwords": "_portuguese_"
},
"portuguese_stemmer": {
"type": "stemmer",
"language": "light_portuguese"
},
"synonym": {
"type": "synonym",
"synonyms": [
"blog, diário",
"loja, venda"
],
"updateable": true
}
},
"analyzer": {
"default_portuguese": {
"tokenizer": "standard",
"filter": [
"lowercase",
"portuguese_stop",
"portuguese_stemmer"
]
},
"synonym_portuguese": {
"tokenizer": "standard",
"filter": [
"lowercase",
"portuguese_stop",
"synonym",
"portuguese_stemmer"
]
}
}
}
}
}
Repare que eu criei 2 analyzers. O primeiro, default_portuguese
, não declara os sinônimos pois vou usá-lo como analyzer de indexação para que os sinônimos não sejam indexados junto com os termos. Já o synonym_portuguese
será utilizado como analyzer de consulta que expande os termos considerando os sinônimos, dessa forma podemos atualizá-los mais facilmente sempre que necessário. Essa distinção é feita no mapeamento dos campos. Veja:
POST /teste_sinonimos/_mapping
{
"properties": {
"meu_campo": {
"type": "text",
"analyzer": "default_portuguese",
"search_analyzer": "synonym_portuguese"
}
}
}
Agora ao indexar um documento que contenha a palavra blog
, será possível pesquisá-lo usando a palavra diário
:
PUT teste_sinonimos/_doc/1
{
"meu_campo": "meu blog favorito"
}
GET teste_sinonimos/_search
{
"query": {
"match": {
"meu_campo": "diario"
}
}
}
Resultado:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "teste_sinonimos",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"meu_campo" : "meu blog favorito"
}
}
]
}
}
Da mesma forma, ao indexar um documento com a palavra loja
eu consigo achá-lo usando o termo venda
. Os sinônimos não se misturam porque usamos a sintaxe no formato solr.
Eu recomendo a leitura do post The same, but different: Boosting the power of Elasticsearch with synonyms que trás muita coisa interessante sobre sinônimos.
Espero ter ajudado!
Abraço,
Luiz Guilherme