2013-09-07 14 views
8

Durante il tentativo di eseguire l'aggiornamento da Solr 4.3.0 a 4.4.0 Solr Mi sono imbattuto in questa eccezione:Solr 4.4: StopFilterFactory e enablePositionIncrements

java.lang.IllegalArgumentException: enablePositionIncrements=false is not supported anymore as of Lucene 4.4 as it can create broken token streams 

che mi hanno portato a this issue. Devo essere in grado di far corrispondere le query indipendentemente dalle stopword intermedie (che funzionava con enablePositionIncrements = "true"). Ad esempio: "foo of the bar" trova i documenti che corrispondono a "foo bar", "foo of bar" e "foo of the bar". Con questa opzione deprecata in 4.4.0 non sono chiaro su come mantenere la stessa funzionalità.

Il package javadoc aggiunge:

Se l'analizzatore selezionato filtra le parole di arresto "è" e "il", poi per un documento contenente la stringa "il blu è il cielo", solo i gettoni "blu" , "sky" sono indicizzati, con posizione ("sky") = 3 + position ("blue"). Ora, una frase frase "blu è il cielo" troverebbe quel documento, perché lo stesso analizzatore filtra le stesse parole di stop da quella query. Ma la query frase "cielo blu" potrebbe non trova quel documento perché l'incremento posizione tra "blu" e "cielo" è solo 1.

Se questo comportamento non si adatta alle esigenze applicative, il parser di query deve essere configurato non prendere in considerazione gli incrementi di posizione durante la generazione di query a frase.

Ma non c'è alcuna menzione di come configurare in realtà il parser query per fare questo. Qualcuno sa come affrontare questo problema mentre Solr si sposta verso 5.0?

+0

hai trovato la soluzione di questo problema? –

+0

@VishalParekh nope - non ho ancora trovato una soluzione ... – condit

+0

@condit Ho lo stesso problema, stavo pensando a reimplementare 'StopFilterFactory' e riabilitare l'opzione per impostare' enablePositionIncrements' su false – MoustafaAAtta

risposta

0

È possibile utilizzare la ricerca di prossimità:

"foo bar"~2 
+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. – diosney

+0

rimosso la domanda retorica :) –

0

Non so se questo è raccomandato per l'uso, ma ci sono ancora alcune classi legacy in Lucene 5, come Lucene43StopFilter.

Purtroppo sembrano scomparsi in Lucene 6 ...

0

ho trovato da qualche parte sulla realizzazione netto di RemoveTokenGapsFilterFactory

public final class RemoveTokenGapsFilter extends TokenFilter { 

    private final PositionIncrementAttribute posIncrAttribute = addAttribute(PositionIncrementAttribute.class); 

    public RemoveTokenGapsFilter(TokenStream input) { 
     super(input); 
    } 

    @Override 
    public boolean incrementToken() throws IOException { 

     if (input.incrementToken()) { 
      posIncrAttribute.setPositionIncrement(1); 
      return true; 
     } 

     return false; 
    } 
}