validar validaciones validacion texto solo sea realizar que números numeros numero limitar letras ingresar hacer especiales entero ejemplos como caracteres java lucene

java - validaciones - ¿Cómo realizar una consulta de Lucene que contenga caracteres especiales utilizando QueryParser?



validar letras números y caracteres especiales en java (2)

No estoy seguro de esto, pero creo que necesitas escapar - con / . Según los documentos de Lucene .

El operador "-" o de prohibición excluye los documentos que contienen el término después del símbolo "-".

Otra vez ,

Lucene admite el escape de caracteres especiales que forman parte de la sintaxis de la consulta. Los caracteres especiales de la lista actual son

+ - && || ! () {} [] ^ "~ *?: / /

Para escapar de estos caracteres usa el / antes del carácter.

Además, recuerde que algunos personajes necesitarán escapar dos veces si tienen un significado especial en Java.

Aquí está la cosa. Tengo un término almacenado en el índice, que contiene caracteres especiales, como ''-'', el código más simple es el siguiente:

Document doc = new Document(); doc.add(new TextField("message", "1111-2222-3333", Field.Store.YES, Field.Index.NOT_ANALYZED)); writer.addDocument(doc);

Y luego creo una consulta usando QueryParser, como esto:

String queryStr = "1111-2222-3333"; QueryParser parser = new QueryParser(Version.LUCENE_36, "message", new StandardAnalyzer(Version.LUCENE_36)); Query q = parser.parse(queryStr);

Y luego uso un buscador para buscar la consulta y no obtener ningún resultado. También he intentado esto:

Query q = parser.parse(QueryParser.escape(queryStr));

Y todavía no hay resultado.

Sin usar QueryParser y, en su lugar, utilizar TermQuery directamente, puede hacer lo que quiera, pero de esta manera no es lo suficientemente flexible para los textos de entrada del usuario.

Creo que tal vez el StandardAnalyzer hizo algo para omitir el carácter especial en la cadena de consulta. Intenté la depuración y encontré que la cadena está dividida y la consulta real es así: "mensaje: 1111 mensaje: 2222 mensaje: 3333". No sé qué ha hecho exactamente Lucene ...

Entonces, si quiero realizar la consulta con un carácter especial, ¿qué debo hacer? ¿Debo reescribir un analizador o heredar un queryparser del predeterminado? ¿Y cómo? ...

Actualizar:

1 @ The New Idiot @femtoRgon, probé QueryParser.escape (queryStr) como se indica en el problema, pero aún no funciona.

2 He intentado otra forma de resolver el problema. Derivé un QueryTokenizer de Tokenizer y corté la palabra solo por espacio, lo empaqué en un QueryAnalyzer, que se deriva de Analyzer, y finalmente puse el QueryAnalyzer en QueryParser.

Ahora funciona. Originalmente, no funciona porque el StandardAnalyzer predeterminado corta el queryStr según las reglas predeterminadas (que reconocen algunos de los caracteres especiales como divisores), cuando la consulta se pasa a QueryParser, los caracteres especiales ya están eliminados por StandardAnalyzer. Ahora uso mi propia manera de cortar la consulta y solo reconoce el espacio como divisor, por lo que los caracteres especiales permanecen en la consulta en espera de procesamiento y esto funciona.

3 @ The New Idiot @femtoRgon, gracias por responder a mi pregunta.


puede agregar el valor como addValue () en lugar de add o addText. y luego busque el carácter especial con un analizador de Kyeword en lugar del analizador estándar. o Agregue los datos con addValue () y mientras busca los datos en luke, reemplace el carácter especial con el carácter de búsqueda de comodín (?). He intentado en ambos sentidos y funciona