Estoy trabajando en una consulta de clasificación de campos múltiples de búsqueda elástica, tengo datos en el siguiente formato:
{ "person_name" : "Abraham Benjamin deVilliers", "created_on": "Tue, 02 Apr 2018 16: 17: 54 GMT", "name": "Abraham", "office":{ "name":"my_office" } }, { "person_name" : "John Bradshaw", "created_on": "Thu Apr 05 2018 14:42:30 GMT", "name": "jhon", "office": { "name":"Abraham deVilliers" } }, { "person_name" : "John Bradshaw", "created_on": "Tue, 03 Apr 2018 11: 39: 17 GMT", "name": "Abraham deVilliers", "office": { "name":"blabla" } } Donde el campo person_name es de tipo text y created_on es de tipo string . Tengo que ordenar la respuesta anterior según los campos person_name y created_on .
La consulta que intentamos es la siguiente:
GET /my_index/_search { sort: [{ "person_name": { "order": "asc" }, "created_on": { "order": "desc" } }] }Al ordenar la respuesta con la consulta anterior, recibo el siguiente error:
mensaje: '[illegal_argument_exception] Los datos de campo están deshabilitados en los campos de texto de forma predeterminada. Establezca fielddata=true en [person_name] para cargar fielddata en la memoria al desinvertir el índice invertido. Tenga en cuenta que esto, sin embargo, puede usar una cantidad significativa de memoria. Alternativamente, use un campo de palabra clave en su lugar.'
Al buscar, encontramos que necesitamos modificar el mapeo del campo person_name de tipo text a tipo keyword . Pero no podemos modificar el mapeo existente ya que contiene millones de registros.
¿Hay alguna otra forma de realizar una consulta de clasificación en el campo de text sin alterar el mapeo existente de la búsqueda elástica?
Cualquier ayuda será apreciada.
Hay dos maneras de lograr lo que necesita.
raw no se analizará, lo que significa que será un término en total, por lo que se puede usar para ordenar. Para hacer esto, deberá actualizar su mapeo y luego usar la API de reindexación para actualizar sus datos (básicamente crea un nuevo índice y luego cambia su aplicación para usar el nuevo índice en lugar del anterior, para hacer esto sin tiempo de inactividad puede usar un alias ). Otra forma de actualizar el índice sin crear uno nuevo es usar la API update_by_query .Todos los enlaces apuntan a la documentación oficial de elasticsearch.