2012-07-19 35 views
46

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í.Elastic Search Problema de guión con el filtro de términos

{ 
    "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 muestre los 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 paso en un valor GUID en este campo que está dividido en guiones y rodeado de llaves, algo así como - {ASD23-34SD-DFE1-42FWW}, necesitaría minúsculas de los caracteres del alfabeto y lo haría necesidad de escapar de las llaves también?

Gracias

+0

que desperdicia un día sólo para darse cuenta de que el problema de no conseguir ningún documento posterior no se debió a una consulta mal pero debido a un guión en mi ejemplo de prueba ... –

Respuesta

79

yo supongo que se analiza su campo, que es el ajuste predeterminado 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 por crear el índice con el nuevo mapeo:

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 quieres un poco de flexibilidad en la búsqueda de 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 se analiza su campo, este registro se encontrará buscando también la palabra "actualizar" o la palabra "tiempo" también.

+0

sólo iba a añadir este como una respuesta. Gracias por la explicación detallada. – Gabbar

+2

Gran respuesta. Es posible que desee cambiar el "texto" a "coincidencia". Parecía que elasticsearch obsoleta texto y lo reemplazó con coincidencia. – khuderm

0

Sobre la base de la respuesta por @imotov Si está utilizando spring-data-elasticsearch entonces 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 necesitas soltar el índice y volver a crear una instancia con nuevas asignaciones.

1

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" 
       } 
     } 
} 
Cuestiones relacionadas