searchresponse query example ejemplo java elasticsearch lucene

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 .

Demostración de Regex101