2010-08-23 21 views
6

Sono un principiante assoluto con Solr e ho un problema con i caratteri indesiderati che entrano nei risultati della query. Ad esempio, quando cerco "foo bar", ho ricevuto contenuti con "'foo' bar" ecc. Voglio solo avere corrispondenze esatte. Per quanto ne so questo può essere impostato nel file schema.xml. mio tenore tipo di campo:Solr query/field analyzer

<fieldtype name="textNoStem" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldtype> 

Per favore fatemi sapere se si conosce la soluzione. Cordiali saluti.

+0

Per chiarire, "foo bar" non deve corrispondere a "'foo' bar" perché il foo è circondato da virgolette singole e "foo bar" non deve corrispondere a "foo" perché manca "bar". È questo che vuoi dire? –

risposta

13

Per entrambi gli analizzatori, la prima riga deve essere il tokenizer. Il tokenizer viene utilizzato per dividere il testo in unità più piccole (parole, la maggior parte delle volte). Per le tue esigenze, lo WhitespaceTokenizerFactory è probabilmente la scelta giusta.

Se si desidera una corrispondenza esatta assoluta, non è necessario alcun filtro dopo il tokenizzatore. Ma se non vuoi che le ricerche siano case sensitive, devi aggiungere un LowerCaseFilterFactory.

Si noti che si dispone di due analizzatori: uno di tipo "indice" e l'altro di tipo "query". Come suggerito dai nomi, il primo viene utilizzato per l'indicizzazione del contenuto mentre l'altro viene utilizzato quando si eseguono le query. Una regola che è quasi sempre buona è avere lo stesso set di tokenizers/filtri per entrambi gli analizzatori.

+0

grazie, questo ha aiutato molto! – Daniel

+0

Suggerirei di utilizzare PatternReplaceCharFilterFactory per rimuovere i singoli caratteri di virgolette prima della tokenizzazione. –

+0

Forse è meglio se l'analizzatore di query ha un filtro Synonym extra in aggiunta a tutto ciò che l'analizzatore di roba ha avuto? – WoLfPwNeR

0

Se si desidera che le corrispondenze esatte utilizzino KeywordTokenizerFactory anziché StandardTokenizerFactory al momento della query.

+0

Grazie per la risposta rapida. Tuttavia durante l'utilizzo di KeywordTokenizerFactory non ottengo alcun risultato con query come "foo bar". Ho provato ad aggiungere per interrogare l'analizzatore ma ancora nessuna modifica. Sono a corto di idee .. – Daniel

0

Suppongo che non si ottengano risultati perché il tokening viene eseguito in modo diverso sui dati già indicizzati. Come detto da Pascal, whitespaceTokenizer è la scelta giusta per il tuo caso. Usalo sia all'indice che al tempo di interrogazione e verifica i risultati dopo aver indicizzato alcuni dati, non i dati precedentemente indicizzati.

Suggerisco di utilizzare la pagina di analisi per visualizzare i risultati senza indicizzazione. È molto utile. Effettuare le modifiche nello schema, aggiornare il core, andare alla pagina di analisi e osservare l'output dettagliato per ottenere l'analisi passo passo.