# Vincular sinônimos dentro do contexto de um filter

**URL:** <https://discuss.elastic.co/t/vincular-sinonimos-dentro-do-contexto-de-um-filter/196397>\
**Category:** Elastic em Português - Brasil\
**Created:** [August 22, 2019, 7:26pm UTC](https://discuss.elastic.co/t/vincular-sinonimos-dentro-do-contexto-de-um-filter/196397 "2019-08-22T19:26:41Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![lucianocarvalho](https://avatars.discourse-cdn.com/v4/letter/l/e47774/32.png) [@lucianocarvalho](https://discuss.elastic.co/u/lucianocarvalho)\
**Post date:** [August 22, 2019, 7:26pm UTC](https://discuss.elastic.co/t/vincular-sinonimos-dentro-do-contexto-de-um-filter/196397/1 "2019-08-22T19:26:42Z")

</div>

Eu consigo organizar melhor os sinônimos dentro de um contexto do `filter`?  
Imagine que tenho uma lista de sinônimos diferentes para `blog` e para `loja`, mas ambos estão no mesmo índice.

Ex:  
**Vincular apenas a lista de sinônimos blog:**

```auto
"filter": [ 
    {
        "term": { "type": "blog" }
    }
]

```

**Vincular apenas a lista de sinônimos loja:**

```auto
"filter": [ 
    {
        "term": { "type": "loja" }
    }
]

```

Consigo separar isso sendo que ambos os documentos estão no mesmo índice?  
Tem algum jeito melhor?

---

<div class="post-metadata">

**Author:** ![luiz.santos](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/luiz.santos/32/24664_2.png) [@luiz.santos](https://discuss.elastic.co/u/luiz.santos)\
**Post date:** [September 3, 2019, 12:48pm UTC](https://discuss.elastic.co/t/vincular-sinonimos-dentro-do-contexto-de-um-filter/196397/2 "2019-09-03T12:48:58Z")

</div>

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:

```auto
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:

```auto
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`:

```auto
PUT teste_sinonimos/_doc/1
{
  "meu_campo": "meu blog favorito"
}

GET teste_sinonimos/_search
{
  "query": {
    "match": {
      "meu_campo": "diario"
    }
  }
}

```

Resultado:

```auto
{
  "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](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html#_solr_synonyms).

Eu recomendo a leitura do post [The same, but different: Boosting the power of Elasticsearch with synonyms](https://www.elastic.co/blog/boosting-the-power-of-elasticsearch-with-synonyms) que trás muita coisa interessante sobre sinônimos.

Espero ter ajudado!

Abraço,  
Luiz Guilherme

---

<div class="post-metadata">

**Author:** ![josemauromani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/josemauromani/32/62668_2.png) [@josemauromani](https://discuss.elastic.co/u/josemauromani)\
**Post date:** [August 10, 2020, 2:59am UTC](https://discuss.elastic.co/t/vincular-sinonimos-dentro-do-contexto-de-um-filter/196397/3 "2020-08-10T02:59:44Z")

</div>

Olá @luiz.santos quero agradecer pelo post pois me ajudou muito com relação a um projeto em que preciso relacionar sinônimos.  
Porém tenho uma pergunta, gostaria de colocar os sinônimos em um arquivo .txt para referenciar em synonyms\_path, mas não estou conseguindo está gerando um erro.  
obs: estou usando windows e referenciando o caminho completo em synonyms\_path.  
Desde ja agradeço.

```auto
    "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "synonym requires either `synonyms` or `synonyms_path` to be configured"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "synonym requires either `synonyms` or `synonyms_path` to be configured"
  },
  "status" : 400
} 

```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [November 4, 2022, 7:22am UTC](https://discuss.elastic.co/t/vincular-sinonimos-dentro-do-contexto-de-um-filter/196397/4 "2022-11-04T07:22:31Z")

</div>


