2012-02-17 24 views
10

Le espressioni regolari consentono la sintassi di corrispondenza del modello mostrata di seguito. Sto cercando di implementare un potente strumento di ricerca che implementa il maggior numero possibile di questi. Mi è stato detto che edismax è lo strumento più flessibile per il lavoro. Quale delle espressioni di corrispondenza del modello qui sotto può essere eseguita con edismax? Posso fare meglio di edismax? Puoi suggerire quali filtri e patch di parser posso usare per raggiungere questa funzionalità? Sto sognando se penso che Solr possa raggiungere prestazioni accettabili (cioè tempo di elaborazione lato server) di questi tipi di ricerche?Quali funzioni di espressioni regolari sono supportate da Solr edismax?

regolari espressione di sintassi & esempi mysql

  1. ^partita dall'inizio della stringa. 'fofo' REGEXP '^fo' => true
  2. $ corrisponde alla fine della stringa. 'fo\no' REGEXP '^fo\no$' => true
  3. * carattere jolly illimitato. 'Baaaan' REGEXP 'Ba*n' => true
  4. ? 0-1 carattere jolly. 'Baan' REGEXP '^Ba?n => false'
  5. + jolly illimitato. 'Bn' REGEXP 'Ba+n' => false
  6. | o. 'pi' REGEXP 'pi|apa' => true
  7. () * sequenza di corrispondenze. 'pipi' REGEXP '^(pi)*$' => true
  8. [a-DX], [^ a-DX] intervallo di caratteri/set 'aXbc' REGEXP '[a-dXYZ]' => true
  9. {n} o {m, n} cardinalità notazione 'abcde' REGEXP 'a[bcd]{3}e' => true
  10. [: character_class:] 'justalnums' REGEXP '[[:alnum:]]+' => true

risposta

15

La versione 4.0 di Lucene supporta le query di regex direttamente nel parser di query standard utilizzando la sintassi speciale. Ho verificato che funzioni su un'istanza di Solr I am running, creata dal trunk di subversion a febbraio.

Jira ticket 2604 descrive l'estensione del parser query standard utilizzando una speciale sintassi regex, utilizzando l'ora barre per descrivere l'espressione regolare, simile alla sintassi in Javascript. Sembra che stia usando il parser di RegexpQuery sottostante.

Quindi un breve esempio:

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

corrisponderà a un codice postale a cinque cifre nel corpus testuale che ho indicizzato. Ma, stranamente, il corpo:/\ d {5}/non ha funzionato per me, e anche^fallito.

Il dialetto regex dovrebbe essere di Java, ma non sono sicuro che tutto funzioni in esso, poiché ho solo fatto un esame superficiale. Uno probabilmente dovrebbe guardare attentamente al codice di RegexpQuery per capire cosa funziona e cosa no.

+0

Ho scavato un po 'di più. Esiste una [pagina che descrive la sintassi supportata] (https://builds.apache.org/job/Lucene-trunk/javadoc/core/org/apache/lucene/util/automaton/RegExp.html). Dopotutto, il motore regex non è Java, ma è stato implementato in Lucene nel pacchetto org.apache.lucene.util.automaton. Vedi anche la documentazione per [RegexpQuery] (https://builds.apache.org/job/Lucene-trunk/javadoc/core/org/apache/lucene/search/RegexpQuery.html). –

+0

Ho appena provato '\ d {4}' in Solr 4.0 su un campo stringa. Non funziona. Sembra che possiamo usare solo '[0-9] {4}'. Tuttavia suppongo che^non sia necessario, dal momento che qualsiasi query come '/ [0-9] {5} /' è in realtà equivalente alla RegEx Perl-Compatibile '/^[0-9] {5} $ /' cioè non usa '. *' come prefisso significa che stai forzando la corrispondenza dal primo carattere. – arun

+1

@RonaldWood Entrambi i link che hai postato sono ora morti. – BlackVegetable

4

Le espressioni regolari e (e) dismax non sono realmente comparabili. Dismax è pensato per funzionare direttamente con l'input dell'utente finale comune, mentre le espressioni regolari non sono tipiche dell'input dell'utente finale.

Inoltre, l'abbinamento di elementi di espressione regolare con dismax dipende in gran parte da text analysis settings e dalla progettazione dello schema, non da Dismax stesso. Con Solr di solito si adatta lo schema e l'analisi del testo alle esigenze di ricerca concreta, probabilmente facendo gran parte del lavoro in fase di index-time. Le espressioni regolari sono in contrasto con questo e anche con la struttura di base degli indici invertiti di Lucene.

Ancora, Lucene fornisce RegexQuery e il più recente RegexpQuery. Per quanto ne so, questi non sono integrati con Solr, ma potrebbero esserlo. Inizia un nuovo articolo nel e felice codifica! :)

Ricordare che le query di regex saranno probabilmente sempre lente ... ma potrebbero avere prestazioni accettabili nel tuo caso.

Problemi correlati