2010-07-22 9 views
14

El comodín * solo se puede usar al final de una palabra, como user*.¿Cómo consultar lucene con el operador "me gusta"?

Quiero consultar con un me gusta %user%, ¿cómo hacerlo?

+0

tema Algo similar: [http://stackoverflow.com/questions/468279/lucene-net-leading-wildcard-character-throws-an-error](http:// stackoverflow.com/questions/468279/lucene-net-leading-wildcard-character-throws-an-error) – devson

Respuesta

9

Lucene proporciona el ReverseStringFilter que permite realizar búsqueda comodín principal como * usuario. Funciona indexando todos los términos en orden inverso.

Pero creo que no hay forma de hacer algo similar a 'LIKE% user%'.

+2

Interesante. En efecto, significa que debe configurar su índice con anticipación para permitir comodines principales. Y al mirar el error (https://issues.apache.org/jira/browse/LUCENE-1398), parece que solo puede especificar un comodín principal, pero no uno posterior en el mismo término (porque entonces usted volvemos al mismo problema). – Jon

6

Desde Lucene 2.1 se puede utilizar

QueryParser.setAllowLeadingWildcard(true); 

pero esto puede matar rendimiento. El LuceneFAQ tiene algo más de información para esto.

3

Cuando lo piense bien, no es del todo sorprendente que el soporte de lucene para wildcarding esté (normalmente) restringido a un comodín al final de un patrón de palabras.

Los motores de búsqueda de palabras clave funcionan creando un índice inverso de todas las palabras en el corpus, que se ordena en orden de palabras. Cuando realiza una búsqueda normal sin comodín, el motor utiliza el hecho de que las entradas de índice se ordenan para ubicar la entrada o las entradas de su palabra en O(logN), pasos donde N es el número de palabras o entradas. Para un patrón de palabras con un comodín de sufijo, sucede lo mismo al encontrar la primera palabra coincidente, y se encuentran otras coincidencias escaneando las entradas hasta que la parte fija del patrón ya no coincida.

Sin embargo, para un patrón de la palabra con un prefijo comodín y un sufijo comodín, el motor tendría que mirar a todos entradas en el índice. Esto sería O(N) ... a menos que el motor construyera una pila completa de índices secundarios para unir subcadenas literales de palabras. (Y eso haría que la indexación sea mucho más costosa). Y para patrones más complejos (por ejemplo, expresiones regulares) el problema sería aún peor para el motor de búsqueda.

14

El problema con las consultas LIKE es que son expensive en términos de tiempo de ejecución. Puede configurar QueryParser para permitir que conduce comodines con lo siguiente:

QueryParser.setAllowLeadingWildcard(true)

y esto va a permitir hacer búsquedas como:

*user*

Pero esto va a tomar mucho tiempo para ejecutar . A veces, cuando las personas dicen que quieren una consulta LIKE, lo que realmente quieren es fuzzyquery. Esto permitirá hacer la siguiente búsqueda:

user~

que se correspondería con los términos y usersfuser. Puede especificar una distancia de edición entre el término en su consulta y los términos que desea emparejar usando un valor flotante entre 0 y 1. Por ejemplo, user~0.8 coincidiría con más términos que user~0.5.

Sugiero que también eche un vistazo a regex query, que admite la sintaxis de expresiones regulares para las búsquedas de Lucene. Puede estar más cerca de lo que realmente necesitas.Tal vez algo como:

.*user.*

Cuestiones relacionadas