2011-11-15 13 views
7

Io uso seguente filtro nella schema.xml:Come aumentare ngram più lunghi in solr?

<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front"/> 

Come posso aumentare le ngrams più lunghi? Ad esempio, quando cerco "bookpage", un documento che contiene "bookpage" dovrebbe essere valutato molto più alto di un documento con solo "book".

risposta

5

Non conosco un modo per aumentare dinamicamente in base alla lunghezza del termine (ad esempio, con un operatore di query di funzione). Sospetto che non ce ne sia uno.

Detto questo, spesso desidero approssimare la logica che stai cercando: le partite a lungo termine meritano un peso semantico più elevato.

Più comunemente, indicherò il valore del testo in due campi diversi. Uno è un campo di testo minimamente processato senza ngrams. L'altro è simile, ma anche elaborato con ngrams.

Ecco alcuni esempi di uno schema che ho usato in questo modo. Per le ricerche su questo schema, aumenterei notevolmente il campo text rispetto allo text_ngram. Pertanto, eventuali corrispondenze con il campo text influenzerebbero notevolmente la pertinenza, mentre le corrispondenze con lo text_ngram possono comunque raccogliere anche risultati rilevanti.

<?xml version="1.0" encoding="UTF-8"?> 
<schema name="Sunspot Customized NZ" version="1.0"> 
    <types> 

    <!-- 
     A text type with minimal text processing, for the greatest semantic 
     value in a term match. Boost this field heavily. 
    --> 
    <fieldType name="text" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

    <!-- 
     Looser matches with NGram processing for substrings of terms and synonyms 
    --> 
    <fieldType name="text_ngram" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="6" side="front" /> 
     </analyzer> 
    </fieldType> 

    <!-- other stuff --> 

    </types> 
    <fields> 

    <!-- id, other scalar values --> 

    <!-- catch-all for the text and text_ngram types --> 
    <field name="text"  stored="false" type="text"  multiValued="true" indexed="true" /> 
    <field name="text_ngram" stored="false" type="text_ngram" multiValued="true" indexed="true" /> 

    <!-- various dynamicField definitions --> 

    <!-- sample dynamicField definitions for text and text_ngram --> 
    <dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="false" /> 
    <dynamicField name="*_text_ngram" type="text_ngram" indexed="true" stored="false" multiValued="false" /> 

    </fields> 

    <!-- copy text fields into my text and text_ngram catch-all fields --> 
    <copyField source="*_text" dest="text" /> 
    <copyField source="*_text" dest="text_ngram" /> 

</schema> 

Questo non è esattamente quello che stai cercando, ma potresti usare un approccio simile.

Ad esempio, creare una piccola raccolta di tipi di campi intermedi elaborati da NGram - ad esempio, di lunghezza 1-3, 4-6, 7-9 - e aumentarli di conseguenza.

+0

wow, grazie per questo approccio, non ho pensato di indicizzarlo più volte :) Come sei arrivato con questa soluzione? – ndee

+1

Non ricordo davvero la prima volta che ho usato questa tecnica - mi sembra che sia un approccio abbastanza comune in Solr. La direttiva 'copyField' è un suggerimento abbastanza forte in tal senso. Penso spesso che le corrispondenze esatte abbiano il valore semantico più forte, in cui sinonimi, ngram, derivazioni, ecc. Sono tutti approcci diversi per "espandere" i risultati della ricerca in caso di mancata corrispondenza dei termini esatti. –

Problemi correlati