2012-04-05 6 views
18

Ho una domanda jolly che sembra qualcosa di simile:Solr interrogazione jolly con uno spazio

q=location:los a* 

mi piacerebbe che per abbinare "Los Angeles" e "Los Altos". Una query come:

q=los* 

funziona bene, ma non appena aggiungo spazi ottengo alcun risultato. Come posso usare gli spazi bianchi nelle mie query con caratteri jolly?

+0

Forse questo non è possibile, le query prefisso frase non sono consentiti: [link] (http://lucene.apache.org/core /old_versioned_docs/versions/3_4_0/queryparsersyntax.html#Wildcard%20ASearches) – tbaz

risposta

0

Senza visualizzare la configurazione, direi utilizzare un KeywordTokenizerFactory come probabilmente si denomina su spazi bianchi ora.

+0

Grazie, sto usando DefaultAnaylzer per l'indicizzazione, e il mio testo del termine è "los angeles" (nessuna tokenizzazione) nell'indice. – tbaz

0

La query (ammesso che abbiate tokenizer spazio bianco): q = Località: Los una * significa che si cerca documento con la parola "los" e una parola che inizia con "a"

Solr (tanto che io sappia) non può determinare se una parola (o un termine) appare prima di un'altra.

1

potrei suggerire il plugin solr interrogazione prefisso se si utilizza solo per i caratteri jolly sul suffisso come eravamo http://lucene.apache.org/solr/4_0_0/solr-core/org/apache/solr/search/PrefixQParserPlugin.html

esempio di utilizzo

http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi 

sarebbe partita "Bob Smith" o "Bob Smit "ma non convertire in un controllo di (" Bob "OR" Smi * ") come accadrebbe se si fosse utilizzata la prima soluzione che si potrebbe considerare lungo le linee di q=name:Bob%20Smi*

Speriamo che questo sia di qualche aiuto per voi o qualcun altro cercando come soluzione immediata perché stavo sbattendo la testa contro un muro per ore prima di averlo trovato!

29

Recentemente mi sono imbattuto in questo problema e sembra che tutto ciò che devi fare è sfuggire allo spazio nella tua query. La vostra query originale sarebbe stata interpretata da Solr come qualcosa di simile a questo:

location:los id:a* 

(assumendo "id" è predefinito campo di ricerca)

Tuttavia, se si dovesse scrivere la query come:

location:los\ a* 

Poi sarebbe finiscono per essere analizzato come:

location:los a* 

E quanto sopra dovrebbe produrre il risultato s che desideri (supponendo che i tuoi dati siano correttamente indicizzati).

Suggerimento: Capire tutto questo è semplice. Basta aggiungere &debugQuery=on alla fine dell'URL che usi quando invii la tua query per vedere come è stata analizzata da Solr.

+1

Ho confermato che funziona con un campo stringa (ma non testo, vedi http://stackoverflow.com/questions/2630879/solr-exact-word-search per ulteriori informazioni). Vorrei averlo trovato prima ... anche, debugQuery = on merita un upvote da solo - molto utile! – BLogan

0

penso che si dovrebbe utilizzare il config come questo

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" /> 
    </analyzer> 
    </fieldType> 

e si deve gestire la vostra parola chiave di ingresso per la ricerca come rimuovere gli spazi

0

Per me lavorato

<fieldtype name="text_like" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
    </analyzer> 
</fieldtype> 

e interrogazione field:*some\ phrase* (in java letteral è necessario eseguire l'escape \ as \\).

0

Ho avuto lo stesso problema nel mio progetto. Ogni volta che cercavo una parola insieme allo spazio bianco non stavo ottenendo il risultato. Così ho sostituito lo spazio bianco con un trattino "-" durante l'indicizzazione e l'interrogazione. Di seguito è riportato lo snipet schema.xml che ho usato per farlo:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([/\s+])" replacement="-" replace="all" 
    /> 
</analyzer> 
<analyzer type="query"> 
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
<filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([/\s+])" replacement="-" replace="all" 
    /> 
</analyzer> 
</fieldType>