Order By eliminar resultados que cominzan con caracter determinado


(leandro) #1

Estimados, cuando hago un order by quiero que los resultados que comienzan con acento o caracteres raro, no los muestre. Por ejemplo si hago un order by Z-A quiero que me excluya todos los resultados que comienzan con comillas "" o con un caracter determinado. Muchas gracias!


(David Pilato) #2

I moved your question to #in-your-native-tongue:elastic-en-espanol as I guess it's the right place for it.

If you don't get an answer here, please go back to #elasticsearch but in english please.


(Gabriel Moskovicz) #3

Hola Leandro,

Me gustaria que me muestres algun ejemplo para poder entenderlo mejor. Tienes algunos documentos que me puedas mostrar por favor para entender mejor esta pregunta?

Saludos!

--Gabriel


(leandro) #4

Hola, gracias por responder. Por ejemplo yo necesito que los libros que empiezan con A esten adelante de los que empiezan con caracteres no alfanumericos.

https://www.bajalibros.com/AR/Buscar?q=amor&sort=title.raw:asc&field=6&page=1

https://www.bajalibros.com/AR/Buscar?q=amor&sort=title.raw:asc&field=6&page=8

Espero tu ayuda.


(Gabriel Moskovicz) #5

Hola Leandro,

Lo que quieres es removerlos completamente? O lo que quieres es que aparezcan al final?

Saludos!
--Gabriel


(leandro) #6

Idealmente que se vean al final. Osea A-Z-Caracteres / Z-A-Caracteres.

Se puede?

Gracias!


(Gabriel Moskovicz) #7

Hola Leandro,

Elasticsearch siempre va a hacer sorting segun el valor asciii the los caracteres. Y obviamente las tablas muestran de que esos caracteres no-alfabeticos estan generalmente al principio. Una idea para hacer esto automaticamente seria utilizar un normalizer para modificar con un caracter que se muestre al final:

DELETE index

PUT index
{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": [
            "my_char_filter"
          ],
          "filter": [
            "lowercase"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "[^a-zA-Z]",
          "replacement": "~"
        }
      }
    }
  },
  "mappings": {
    "type": {
      "properties": {
        "title": {
          "type": "text",
          "fields": {
            "raw": {
              "type": "keyword",
              "normalizer": "my_normalizer"
            }
          }
        }
      }
    }
  }
}

PUT index/type/1
{
  "title": "a title"
}

PUT index/type/2
{
  "title": "b title"
}

PUT index/type/3
{
  "title": "#title"
}

POST index/_refresh

GET index/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "title.raw": {
        "order": "asc"
      }
    }
  ]
}

El resultado es:


{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": null,
    "hits": [
      {
        "_index": "index",
        "_type": "type",
        "_id": "1",
        "_score": null,
        "_source": {
          "title": "a title"
        },
        "sort": [
          "a~title"
        ]
      },
      {
        "_index": "index",
        "_type": "type",
        "_id": "2",
        "_score": null,
        "_source": {
          "title": "b title"
        },
        "sort": [
          "b~title"
        ]
      },
      {
        "_index": "index",
        "_type": "type",
        "_id": "3",
        "_score": null,
        "_source": {
          "title": "#title"
        },
        "sort": [
          "~title"
        ]
      }
    ]
  }
}

Pero esto funciona solo para asc y para desc deberias de utilizar, de lo contrario, un caracter que aparezca al principio de la tabla ascii. Toma en cuenta que esto esta modificando todos los valores del field raw, entonces tal vez quieras corroborar esto y tal vez crear otro field a parte del raw.

Por otro lado, si siempre quieres estos caracteres separados tal vez convenga hacer dos queries, y siempre mostrar los ultimos resultados estos, pero eso complicaria aun mas el tema. Otra posibilidad tambien es utilizar un function score para detectar los no-alfabeticos.

Saludos!
--Gabriel


(system) #8

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.