Vincular sinônimos dentro do contexto de um filter

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:

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

Vincular apenas a lista de sinônimos loja:

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

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

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

1 Like

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.

    "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
}