tutorial example search lucene solr

search - example - Error de WildcardQuery en Solr



solr vs lucene (7)

En realidad, he estado usando una solución para esto. Añado un carácter a la identificación, por ejemplo: A1, A2, etc.

Con tales valores en el campo, es posible buscar usando la id:A* la consulta id:A*

Pero me encantaría encontrar si existe una verdadera solución.

Yo uso solr para buscar documentos y cuando trato de buscar documentos usando esta consulta " id:* ", obtengo esta excepción del analizador de consultas diciendo que no puede analizar la consulta con * o? como el primer personaje.

HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse ''id:*'': ''*'' or ''?'' not allowed as first character in WildcardQuery type Status report message org.apache.lucene.queryParser.ParseException: Cannot parse ''id:*'': ''*'' or ''?'' not allowed as first character in WildcardQuery description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse ''id:*'': ''*'' or ''?'' not allowed as first character in WildcardQuery).

¿Hay algún parche para que esto funcione con solo *? ¿O es muy costoso hacer una consulta?


Lucene no le permite iniciar WildcardQueries con un asterisco de manera predeterminada, porque esas son consultas increíblemente caras y serán muy, muy, muy lentas en índices grandes.

Si está utilizando Lucene QueryParser, llame a setAllowLeadingWildcard (true) para habilitarlo.

Si desea que todos los documentos con un determinado campo estén configurados, es mucho mejor que consulte o pase el índice programáticamente que usando QueryParser. En realidad, solo debería usar QueryParser para analizar la entrada del usuario.


id:[a* TO z*] id:[0* TO 9*] etc.

Acabo de hacer esto en lukeall en mi índice y funcionó, por lo tanto, debería funcionar en Solr, que utiliza el analizador de consultas estándar. Realmente no uso Solr.

En la base de Lucene, hay una buena razón por la que nunca consultarías para cada documento, es porque para consultar un documento debes usar un new indexReader("DirectoryName") y aplicarle una consulta. Por lo tanto, puede saltarse totalmente la aplicación de una consulta y usar los métodos numDocs() para obtener un recuento de todos los documentos, y document(int n) para recuperar cualquiera de los documentos.


Si desea todos los documentos, realice una consulta en *: *

Si desea todos los documentos con un determinado campo (por ejemplo, id) intente con id: [* TO *]


Si solo intenta obtener todos los documentos, Solr admite la consulta *: *. Es la única vez que sé que Solr te permitirá comenzar una consulta con un *. Estoy seguro de que probablemente haya visto esto como la consulta predeterminada en la página de administración de Solr.

Si está intentando hacer una consulta más específica con un * como primer carácter, como por ejemplo id: * 456, una de las mejores formas que he visto es indexar ese campo dos veces. Una vez normalmente (nombre de campo: id), y una vez con todos los caracteres invertidos (nombre de campo: reverse_id). Entonces, básicamente, podría hacer la identificación de la consulta: 456 enviando la consulta reverse_id: 654 en su lugar. Espero que tenga sentido.

También puede buscar en la lista de correo del grupo de usuarios de Solr en http://www.mail-archive.com/[email protected]/ donde preguntas como esta aparecen con bastante frecuencia.


El siguiente problema de Solr es una solicitud para poder configurar el analizador de consultas lucene predeterminado. https://issues.apache.org/jira/browse/SOLR-218

En este número, puede encontrar la siguiente descripción sobre cómo ''parchear'' Solr. Esta modificación le permitirá iniciar consultas con un *.

Jonas Salk: básicamente, he actualizado solo un archivo Java: SolrQueryParser.java.

public SolrQueryParser(IndexSchema schema, String defaultField) { ... setAllowLeadingWildcard(true); setLowercaseExpandedTerms(true); ... } ... public SolrQueryParser(QParser parser, String defaultField, Analyzer analyzer) { ... setAllowLeadingWildcard(true); setLowercaseExpandedTerms(true); ... }

No estoy seguro si setLowercaseExpandedTerms es necesario ...


Supongo que con id: * solo intentas hacer coincidir todos los documentos, ¿verdad?

Nunca he usado solr antes, pero en mi experiencia de Lucene, al ingerir datos, hemos agregado un campo oculto a cada documento, luego cuando necesitamos devolver cada registro hacemos una búsqueda de la constante de cadena en ese campo que es el lo mismo para cada registro.

Si no puede agregar un campo como ese en su situación, podría usar un RegexQuery con una expresión regular que coincida con cualquier cosa que se encuentre en el campo de identificación.

Editar: en realidad respondiendo la pregunta. Nunca he oído hablar de un parche para que funcione, pero me sorprendería si incluso pudiera funcionar razonablemente bien. Consulte esta pregunta por una razón por la cual PrefixQuery no restringido puede causar un problema.