lunedì 12 dicembre 2011

Che con lettere minuscole jolly (MultiTerm) interroga in Solr?

I termini della query jolly non vengono analizzati, perché?

Prima il ramo corrente 3x (che sarà rilasciata come 3.6) e la (4,0) codice tronco Solr, gli utenti sono stati spesso perplessi cercando jolly essere un-analisi, spesso si manifesta in maiuscole e minuscole. Diciamo che ha una catena di analisi nel file schema.xml definiti come segue e un campo chiamato lc_field di questo tipo:
1.fieldType name "minuscolo" class ="solr.TextField" >
2.tokenizzatore class ="solr.WhitespaceTokenizerFactory" />
3.filtro class ="solr.LowercaseFilterFactory" />
4.</ fieldType >
Ora, si indice il testo "Il mio cane ha le pulci". Fin qui, tutto bene. Ricerca su questo campo come 
field_lc: pulci restituisce il documento, così come field_lc: pulce *.
Ma ora si cerca il field_lc: mercatino delle pulci * e non si ottiene alcun risultato. Cosa ?!?!?! Quasi tutti i graffi la testa su questo, ed è una domanda che viene spesso a nella lista utenti di Solr. Gli utenti chiedono perché la catena di analisi di cui sopra non si applica alle domande jolly. Si scopre che è più difficile di quanto si possa pensare in un primo momento. Cosa succede quando un termine unico ingresso viene diviso in più parti? Per esempio, per quelli di voi conosce WordDelimiterFilterFactory (WDDF) che può dividere sul cambiamento caso. Che cosa significa a '* pulce' analizzare? Applicando WDDF potrebbe dare due token 'fle' e 'A' e forse 'pulce'. Se il jolly è presente, quello che i token dovrebbero essere emessi?
  1. 'Pulce *'
  2. 'Fle *', 'A *' 'pulce *',
  3. 'Fle *', 'A *'
  4. <inserire tuo qui> soluzione
È possibile, oserei dire, creare una regola che ti piace. E sarà sbagliato in alcune situazioni. Di particolare orrore è tutto ciò che produce 'A *' come sopra, concettualmente, sarebbe di avere un enorme clausola OR composto da tutti i termini che è iniziato con 'A' nell'indice. A meno che non aveva una regola come "farlo solo se il frammento precedente era di 2 o più caratteri". Ma poi qualcuno direbbe "Ho bisogno di tre caratteri", così può WDDF fornire un "wildCardMin = #" parametro? Ho problemi a mantenere tutti i parametri con WDDF e come interagiscono nella mia mente già, percorrere questa strada sarebbe un incubo. E non ho nemmeno preso in considerazione alcune delle realtà questioni interessanti, come come la vicinanza sarebbe stato incorporato in tutto questo.

I caratteri jolly non sono l'unico problema

Lo stesso problema si verifica con la piegatura accento, normalizzazioni, e, davvero, qualsiasi altro componente di una catena di analisi che in qualche modo modifica i termini query. Questo comportamento è stato per lo più ignorati nelle release precedenti, è stato fino al programmatore applicazione manualmente "fare la cosa giusta" prima di inviare la query a Solr. Questo spesso comporta operazioni come inferiore di rivestimento e accento pieghevole sul lato delle applicazioni quando si incontra una wildcard.
Il nuovo modo di trattare questi casi
A partire dal Solr-2438  questo comportamento non è più vero per un certo numero di casi più comuni. Una catena di analisi delle query che contiene una qualsiasi delle seguenti componenti saranno automaticamente "fare la cosa giusta" e applicare loro per il multi-termine query. Se la vostra catena di analisi è costituito da uno qualsiasi di questi elementi, e volete che applicata al "multi-termine" query, non dovete fare nulla, sarà "solo lavoro". In fase di query, le trasformazioni indicate sono applicati i termini di query e tutti sono felici. O dovrebbe essere. Do atto che si tratta di un tutto-o-niente il funzionamento. Tutti  gli elementi che si trovano al di sotto della catena di analisi delle query vengono applicati al termine multi-termini.
    • ASCIIFoldingFilterFactory
    • LowerCaseFilterFactory
    • LowerCaseTokenizerFactory
    • MappingCharFilterFactory
    • PersianCharFilterFactory
Ancora una volta, questo significa che effettivamente non è necessario preoccuparsi di queste trasformazioni più. Una nota di spiegazione, però. Ho parlato della "catena di analisi delle query". Ma cosa succede se non ne avete uno?Ricordate che il vostro tag <analyzer> può avere diverse possibili 'tipo' dei parametri; "indice", o "query", o nessuno. Beh, se un 'type = "query"' si trova, quella catena di analisi viene ispezionato e uno qualsiasi dei componenti di cui sopra sono registrati per essere utilizzati su sistemi multi-termine query. Se no 'type = "query"' si trova, allora il 'type = "index"' è usato.E se no 'type = "index"' si trova, rispetto a quello senza parametri 'tipo' è usato.

Che cosa significa "multi-termine" significa comunque?

Ho anche spruzzato la frase "mult-termine" in giro, e talvolta "jolly". Si scopre che il caso semplice jolly è una specializzazione di una categoria più ampia di domande, tra cui:
    • jolly
    • gamma
    • prefisso
Tutti questi sono ora gestiti come sopra.

Expert livello di schema possibilità

Tutto quanto sopra è automatico, ma ci sono tre domande immediate:
    • che dire di alcune delle altre  componenti?
    • cosa succede se ho bisogno il vecchio comportamento?
    • quello che se voglio qualcosa di completamente diverso?
Si scopre che tutti e tre di queste domande hanno la stessa risposta. Ma prima che lo schema, voglio sottolineare che è molto probabilmente non avete bisogno di prendersi cura di ciò che segue!  Potrebbe essere necessario sapere su questo in casi particolari, per cui ne farò menzione qui.
Nelle spiegazioni di cui sopra, ho scritto che "catena di analisi è ispezionato e uno qualsiasi dei componenti di cui sopra sono registrati per essere utilizzato su multi-termine query". Ebbene, ciò che effettivamente accade è che c'è una catena nuova analisi in città che può essere specificato nel file schema.xml chiamato, avete indovinato, "MultiTerm". Viene specificato come questo come parte di un <fieldType>ine?
1.analizzatore di tipo "MultiTerm" >
2.tokenizzatore class "solr.WhitespaceTokenizerFactory" />
3.filtro class "solr.ASCIIFoldingFilterFactory" />
4.filtro class "solr.YourFavoriteFilterFactoryHere" />
5.</ analizzatore >
Puoi mettere qualsiasi  componente che è legale in un 'type = "index"' o 'type = "query"' analisi della catena. Se si voleva, per esempio, di far rispettare il vecchio stile del comportamento, è possibile specificar

1.tokenizzatore class "solr.KeywordTokenizerFactory" />
come l'intera catena "MultiTerm" analisi. Sembra un po 'strano da usare KeywordTokenizerFactory qui, ma questo vale per i singoli termini, non l'ingresso intero. Quindi è in effetti dire "non analizzare i termini a tutti". Suona familiare? Questo è solo ciò che è accaduto storicamente.

Come funziona questo si riferiscono al comportamento automatico?

Ebbene, ciò che realmente accade sotto le coperte è che se non si definisce il proprio catena "MultiTerm" analisi, Solr costruisce una per voi da analizzatori che hanno definito come sopra delineato, query, indice o di default, in questo ordine.

Waaaaay sotto le coperte, giù nel codice

Tutto ciò si compie facendo componenti "consapevole MultiTerm". Questo significa che implementa l'interfaccia "MultiTermAwareComponent". Attualmente, i componenti elencati sopra sono gli unici che implementano questa interfaccia, ma altre possono essere buoni candidati, e alcuni di questi sono elencati nella JIRA Solr-2921 . In generale, l'attuazione di questi nel codice può  essere banale. Ciò che è non  banale è capire cosa significa "la cosa giusta" è.Alcuni esempi:
    • stemmer
    • varie specifiche della lingua normalizzazione filtri
    • varie specifiche della lingua minuscolo filtri.
    • vari filtri ICU
La ragione per cui questi non sono stati fatti "termine più consapevoli" è il solito open-source ragione, "Quello che abbiamo è un buon passo avanti, non dovrebbe ritardare tutto per ottenere i casi di utilizzo ultimi curato". In altre parole il implementatori (io in questo caso, con un sacco di aiuto da altri) sono stanchi.
Chiunque capisce veramente quale sia la cosa giusta da fare nei casi di componenti che ancora non implementano "MultiTermAwareComponent" e potrebbe fornire casi d'uso per loro sarebbe darci un grande aiuto, in particolare fornendo esempi che illustrano gli ingressi e uscite corretti per il jolly casi. E alcuni esempi di ciò che dovrebbe nonuscire pure. O meglio ancora, un test JUnit progetto che avrebbe mostrato il comportamento previsto. O meglio ancora, una patch completa!
Qualsiasi modifica che produce potenzialmente più di un segno deve essere maneggiato con cura, vedere il codice per LowerCaseTokenizerFactory per un caso emblematico. Si consideri che Solr ora un'eccezione se la trasformazione produce più di un gettone, quindi percorrere con cautela!
Questo cambiamento dovrebbe rimuovere da lungo tempo punto di confusione per gli utenti Solr. Saremmo molto interessati a qualsiasi commento da parte della comunità, e soprattutto i problemi che emergono. Solr-2438 ha le patch sia per il 3x e righe di codice 4x, ma è probabilmente più facile solo per ottenere una corrente di lato 3x o 4x (o nightly build) se si vuole testare questo "in the wild", il codice è stato impegnato e costruito. Rimane qualche lavoro da fare per incorporare questa modifica per i componenti un'analisi più, chi vuole fare volontariato?

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.