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!
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.
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
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.
Hola Leandro,
Lo que quieres es removerlos completamente? O lo que quieres es que aparezcan al final?
Saludos!
--Gabriel
Idealmente que se vean al final. Osea A-Z-Caracteres / Z-A-Caracteres.
Se puede?
Gracias!
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
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.