Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Pesquisa com "Like"

Olá, Estive pesquisando em como fazer uma pesquisa com like, porém não obtive sucesso. As pesquisas com prefix e wildcard não retornam os dados, por exemplo: Campo nome de um documento com o valor "MIS", ao usar prefix "MI" não retorna, também com wildcard "M*". Ao pesquisar encontrei um analyzer de autocomplete, onde o min_gram é 1:

{
    "analysis": {
        "filter": {
            "autocomplete_filter": { 
                "type":     "edge_ngram",
                "min_gram": 1,
                "max_gram": 20
            }
        },
        "analyzer": {
            "autocomplete": {
                "type":      "custom",
                "tokenizer": "standard",
                "filter": [
                    "lowercase",
                    "autocomplete_filter" 
                ]
            }
        }
    }
}

Maaping:

{
  "lancamentos": {
    "properties": {
        "nome": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          },
          "analyzed": {
            "type": "text",
            "analyzer": "autocomplete"
          }
        }
      }
    }
  }
}

Porém retorna dados que não estou procurando, por exemplo: Ao pesquisar passando "2017", retorna os documentos "2016.01", "2016.02". Ao checar os tokens do analyzer, verifiquei que é gerado um token para cada combinação, teria como pesquisar somente com a maior?

Por exemplo: /_analyze?analyzer=autocomplete&text=2017

{
  "tokens": [
    {
      "token": "2",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "20",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "201",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "2017",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    }
  ]
}

Teriam alguma sugestão de se resolver isso?

Obrigado!

3 respostas

Será que isso aqui pode te ajudar => https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html ?

Alberto Souza, infelizmente não, o resultado acaba sendo o mesmo. Pelo que entendi esta pesquisa busca documentos similares aos termos pesquisados. Assim se procuro 2017, 2016 acaba sendo similarmente igual. O que busco é algo similar a um where com like, de uma consulta em um banco relacional. Obrigado!

solução!

Olá,

Consegui resolver, no analyzer, coloquei o operator "and":

{
    "analysis": {
        "filter": {
            "autocomplete_filter": { 
                "type":     "edge_ngram",
                "operator":     "and",
                "min_gram": 1,
                "max_gram": 20
            }
        },
        "analyzer": {
            "autocomplete": {
                "type":      "custom",
                "tokenizer": "standard",
                "filter": [
                    "lowercase",
                    "autocomplete_filter" 
                ]
            }
        }
    }
}

Dessa forma a pesquisa retorna apenas os documentos que se enquadrem em todos os tokens.

Obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software