2012-02-17 14 views
10

Las expresiones regulares permiten la sintaxis de coincidencia de patrones que se muestra a continuación. Estoy tratando de implementar una poderosa herramienta de búsqueda que implemente tantos de estos como sea posible. Me dijeron que edismax es la herramienta más flexible para el trabajo. ¿Cuál de las siguientes expresiones de coincidencia de patrón se puede lograr con edismax? ¿Puedo hacerlo mejor que edismax? ¿Puede sugerir qué filtros y parches de analizador puedo utilizar para lograr esta funcionalidad? ¿Estoy soñando si creo que Solr puede lograr un rendimiento aceptable (es decir, el tiempo de procesamiento del lado del servidor) de este tipo de búsquedas?¿Qué funciones de expresiones regulares son compatibles con Solr edismax?

regulares de expresión de sintaxis & ejemplos de mysql

  1. ^partido de inicio de la cadena. 'fofo' REGEXP '^fo' => true
  2. $ match al final de la cadena. 'fo\no' REGEXP '^fo\no$' => true
  3. * 0-wildcard ilimitado. 'Baaaan' REGEXP 'Ba*n' => true
  4. ? 0-1 comodín. 'Baan' REGEXP '^Ba?n => false'
  5. + 1-wildcard ilimitado. 'Bn' REGEXP 'Ba+n' => false
  6. | o. 'pi' REGEXP 'pi|apa' => true
  7. () * coincidencia de secuencia. 'pipi' REGEXP '^(pi)*$' => true
  8. [a-dX], [^ a-dX] intervalo de caracteres/set 'aXbc' REGEXP '[a-dXYZ]' => true
  9. {n} o {m, n} cardinalidad notación 'abcde' REGEXP 'a[bcd]{3}e' => true
  10. [: character_class:] 'justalnums' REGEXP '[[:alnum:]]+' => true

Respuesta

15

La versión 4.0 de Lucene admitirá las consultas de expresiones regulares directamente en el analizador de consultas estándar utilizando una sintaxis especial. Verifiqué que funciona en una instancia de Solr que estoy ejecutando, construida desde el tronco de subversión en febrero.

Jira ticket 2604 describe la extensión del analizador de consultas estándar utilizando la sintaxis especial de expresiones regulares, utilizando barras diagonales para delimitar la expresión regular, similar a la sintaxis en Javascript. Parece estar usando el analizador RegexpQuery subyacente.

lo tanto, un breve ejemplo:

body:/[0-9]{5}/ 

tengan una equivalencia con un código postal de cinco dígitos en el corpus textual que he indexado. Pero, curiosamente, body:/​​\ d {5}/no funcionó para mí, y^también falló.

El dialecto de expresiones regulares tendría que ser de Java, pero no estoy seguro de si todo en él trabaja, ya que sólo he hecho un examen superficial. Probablemente, uno debería mirar cuidadosamente el código RegexpQuery para entender qué funciona y qué no.

+0

Cavé un poco más. Hay una [página que describe la sintaxis soportada] (https://builds.apache.org/job/Lucene-trunk/javadoc/core/org/apache/lucene/util/automaton/RegExp.html). El motor de expresiones regulares no es Java, después de todo, sino uno implementado en Lucene en el paquete org.apache.lucene.util.automaton. Véase también la documentación de [RegexpQuery] (https://builds.apache.org/job/Lucene-trunk/javadoc/core/org/apache/lucene/search/RegexpQuery.html). –

+0

Acabo de probar '\ d {4}' en Solr 4.0 en un campo de cadena. No funciona. Parece que solo podemos usar '[0-9] {4}'. Sin embargo, supongo^no es necesario, ya que cualquier consulta como '/ [0-9] {5} /' es en realidad equivalente a Perl-Compatible RegEx '/^[0-9] {5} $ /' es decir, no se utiliza '. *' como prefijo significa que estás forzando el partido desde el primer char. – arun

+1

@RonaldWood Ambos enlaces publicados ahora están muertos. – BlackVegetable

4

Las expresiones regulares y (e) dismax no son realmente comparables. Dismax está diseñado para trabajar directamente con la entrada común del usuario final, mientras que las expresiones regulares no son entradas típicas del usuario final.

Además, emparejar cosas de expresión regular con dismax depende en gran medida de text analysis settings y del diseño de esquema, no de la propia dismax. Con Solr normalmente adapta el análisis de esquema y texto a la necesidad de búsqueda concreta, posiblemente haciendo gran parte del trabajo en tiempo de índice. Las expresiones regulares están en desacuerdo con esto e incluso con la estructura básica de los índices invertidos de Lucene.

Aún así, Lucene proporciona RegexQuery y la más reciente RegexpQuery. Hasta donde yo sé, estos no están integrados con Solr, pero podrían serlo. ¡Comience un nuevo artículo en el Solr issue tracker y feliz codificación! :)

Tenga en cuenta que las consultas regex probablemente siempre serán lentas ... pero podrían tener un rendimiento aceptable en su caso.

Cuestiones relacionadas