java - query - coincidencia de patrones en la búsqueda elástica?
search request elasticsearch java (2)
Olvidas agregar -
antes ?
en su expresión regular y también use anclajes si es necesario.
"[0-9]{3}-?[0-9]{2}-?[0-9]{4}"
O
"^[0-9]{3}-?[0-9]{2}-?[0-9]{4}$"
Continuando con mi publicación anterior, he cambiado la consulta de acuerdo con la publicación de femtoRgon, algunos caracteres y anclas no son compatibles con la búsqueda elástica.
Estoy buscando la manera de hacer coincidir el patrón como "xxx-xx-xxxx" para buscar documentos con números de seguridad social usando elastic search
.
Supongamos, en documentos indexados, me gustaría encontrar todos aquellos documentos que tengan números de seguridad social que coincidan con el patrón "xxx-xx-xxxx".
Código de muestra para indexar el documento:
InputStream is = null;
try {
is = new FileInputStream("/home/admin/Downloads/20121221.doc");
ContentHandler contenthandler = new BodyContentHandler();
Metadata metadata = new Metadata();
Parser parser = new AutoDetectParser();
parser.parse(is, contenthandler, metadata, new ParseContext());
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (is != null) is.close();
}
Código de muestra para buscar
QueryBuilder queryBuilderFullText = null;
queryBuilderFullText = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
FilterBuilders.regexpFilter("_all", "[0-9]{3}?[0-9]{2}?[0-9]{4}"));
SearchRequestBuilder requestBuilder;
requestBuilder = client.prepareSearch()
.setIndices(getDomainIndexId(project))
.setTypes(getProjectTypeId(project))
.setQuery(queryBuilderFullText);
SearchResponse response = requestBuilder.execute().actionGet(ES_TIMEOUT_MS);
SearchHits hits = response.getHits();
if (hits.getTotalHits() > 0) {
System.out.println(hits.getTotalHits());
} else {
return 0l;
}
Estoy recibiendo éxitos por seguir:
45-555-5462
457-55-5462
4578-55-5462
457-55-54623
457-55-5462-23
Pero según mi requisito, solo debería devolver "457-55-5462" (según el patrón de coincidencia "xxx-xx-xxxx").
Por favor ayuda.
Viendo que ^
, $
y /d
no se pueden usar, yo haría esto:
[^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-]
O en Java:
FilterBuilders.regexpFilter("_all", "[^0-9-][0-9]{3}-[0-9]{2}-[0-9]{4}[^0-9-]"));
Que comprueba que antes o después del número encontrado no hay otros números o guiones. Sin embargo, requiere que haya un personaje antes y después del partido, por lo que no se capturarán documentos que tengan el número de la seguridad social como el principio o el final .