2012-06-18 14 views
6

La lingua olandese e tedesca hanno parole che possono essere combinate a nuove parole; parole composte.tokenizer parola composta Solr - risultati trattati come OR statement

Ad esempio "accountmanager" è considerato una parola, composta dalle parole "account" e "manager". I nostri utenti utilizzeranno "accountmanager" e "account manager" in documenti e query e si aspettano gli stessi risultati per entrambe le query.

Per poter decompound (split) parole solr ha un filtro dizionario che ho configurato nello schema:

<filter class="solr.DictionaryCompoundWordTokenFilterFactory" dictionary="../../compound-word-dictionary.txt" minWordSize="8" minSubwordSize="4" maxSubwordSize="15" onlyLongestMatch="true"/> 

Il file composto-word-dictionary.txt contiene una lista di parole che sono usati per decomporre parole composte. In questo elenco troverai ad esempio le parole "account" e "manager".

Il risultato decompound è ok, se analizzato nel debugger Solr durante la ricerca con query "accountmanager": (termine testo):

  • accountmanager
  • conto
  • direttore

Questo risultato, tuttavia, viene considerato come un'istruzione OR e trova tutti i documenti che contengono almeno uno dei termini in esso contenuti. Voglio che si comporti come un'istruzione AND (quindi voglio solo i risultati che hanno entrambi i termini "account" e "manager" nel documento).

Ho provato a impostare l'operatore di default nello schema su "AND", ma questo viene ignorato quando si utilizza edismax. Così ho impostato il Min-should-Match proposto al 100% (mm = 100%), di nuovo senza alcun risultato desiderato. La modifica degli attributi del filtro dizionario nello schema non modifica il comportamento in "AND".

Qualcuno si è imbattuto in questo comportamento quando utilizza la parola chiave composta del dizionario e conosce una soluzione che consente di comportarsi come un'istruzione AND?

risposta

3

funziona come previsto, il DictionaryCompoundWordTokenFilterFactory sta semplicemente aggiungendo le "parole interne" che ha trovato, in questo caso sia "account" che "manager" ma potrebbe essere stato solo uno, se per esempio la parola era "accountbanana" e 'banana' non è nel dizionario solo 'account' sarebbe stato aggiunto.

Questo serve a qualcuno che cerca "manager" e trova anche il documento che ha "accountmanager".

Al fine di ottenere il comportamento desiderato (Capisco che si sta applicando questo sul lato query) si potrebbe usare un dizionario che fa accountmanager = "account manager"

+0

Grazie per la spiegazione. Risposta chiara del comportamento di DictionaryCompoundWordTokenFilterFactory. Ho interpretato erroneamente il suo uso e vedo ora che non servirà ai miei bisogni in questo caso. Il suggerimento suggerito è in realtà il mio prossimo passo (usando solr.SynonymFilterFactory). Speravo di semplificare il filtro dei sinonimi in combinazione con la fabbrica di filtri a parola composta. –

2

Solo un testa a testa come sto prendendo uno sguardo a questo, c'è molto rumore aggiunto quando si fa questo. Poiché SOLR 3.6 imposta l'incremento di posizione di ogni token spezzato su 0 in CompoundWordTokenFilterBase, otterrete query indicizzate correttamente (sorta). Tuttavia, quando si esegue una query, si otterrà una query O gigante della parola composta in quanto AnalyzerQueryNodeProcessor controlla solo se positionCount == 1.

Ad esempio una ricerca di Castaway richiederà (naufrago o cast o via).Questo aggiunge un sacco di rumore, dove il film Castaway (che è davvero Cast Away) funzionerà, ma ottieni anche tutto ciò che ha solo "Away" o semplicemente "Cast".

In realtà abbiamo applicato patch a Lucene per impostarePositionIncrement su 1 e aggiunto un po 'di codice aggiuntivo in AnalyzerQueryNodeProcessor in modo che ci siano OR PhrQueryNodes in cui otterrete ("naufrago" o "cast away"). Anche questo non è corretto, ma riduce il rumore. Le query a frase possono restituire risultati strani se si imposta sempre la posizione su 1, poiché (castaway0, cast1, away2), possono restituire risultati di "naufrago". Anche le posizioni dei termini successivi sono ora disattivate. Per una descrizione migliore, vedi: http://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html