should - elastic search query filter
Elastic Search Problema de guión con filtro de términos (3)
Tengo la siguiente consulta de búsqueda elástica con solo un filtro de términos. Mi consulta es mucho más compleja, pero solo intento mostrar el problema aquí.
{
"filter": {
"term": {
"field": "update-time"
}
}
}
Cuando paso en un valor con guiones al filtro, obtengo cero resultados. Pero si intento sin un valor sin cifrar, obtengo resultados. No estoy seguro de si el guión es un problema aquí, pero mi escenario me hace creerlo.
¿Hay alguna manera de escapar del guión para que el filtro arroje resultados? Intenté escapar del guión con una barra invertida que leí de los foros de Lucene, pero no sirvió de nada.
Además, si transfiero un valor GUID a este campo que está dividido con guiones y rodeado de llaves, algo como - {ASD23-34SD-DFE1-42FWW}, necesitaría minúsculas de los caracteres del alfabeto y tendría que escapar del ¿llaves también?
Gracias
La respuesta aceptada no funcionó para mí con el elástico 6.1. Lo resolví utilizando el campo "palabra clave" que elástico proporciona por defecto en los campos de cadena.
{
"filter": {
"term": {
"field.keyword": "update-time"
}
}
}
Según la respuesta de @imotov Si está utilizando spring-data-elasticsearch , todo lo que necesita hacer es marcar su campo como:
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
en lugar de
@Field(type = FieldType.String)
El problema es que debes soltar el índice y volver a crear una instancia con nuevas asignaciones.
Supongo que su campo se analiza, que es la configuración predeterminada para los campos de cadena en elasticsearch. Como resultado, cuando se indiza no se indexa como un término "tiempo de actualización" sino 2 términos: "actualización" y "tiempo". Es por eso que su término de búsqueda no puede encontrar este término. Si su campo siempre contendrá valores que tendrán que coincidir completamente como están, sería mejor definir dicho campo en el mapeo como no analizado. Puede hacerlo recreando el índice con nueva asignación:
curl -XPUT http://localhost:9200/your-index -d ''{
"mappings" : {
"your-type" : {
"properties" : {
"field" : { "type": "string", "index" : "not_analyzed" }
}
}
}
}''
curl -XPUT http://localhost:9200/your-index/your-type/1 -d ''{
"field" : "update-time"
}''
curl -XPOST http://localhost:9200/your-index/your-type/_search -d''{
"filter": {
"term": {
"field": "update-time"
}
}
}''
Alternativamente, si desea cierta flexibilidad para encontrar registros basados en este campo, puede mantener este campo analizado y utilizar consultas de texto en su lugar:
curl -XPOST http://localhost:9200/your-index/your-type/_search -d''{
"query": {
"text": {
"field": "update-time"
}
}
}''
Tenga en cuenta que si su campo es analizado, este registro se encontrará buscando solo la palabra "actualización" o la palabra "tiempo" también.