2014-10-14 17 views
6

In un caso molto semplice, ho tre documenti con nomi di file "Lark", "Larker" e "Larking" (nessuna estensione di file). In solr, indicizzo questi tre documenti che mappano il nome del file in un campo "titolo". Quando faccio una ricerca per "Lark" vengono restituiti tutti e tre i documenti (che è quello che voglio) ma hanno tutti lo stesso punteggio. Preferirei che "Lark" avesse il punteggio più alto, in quanto corrisponde esattamente alla mia richiesta, con gli altri che stanno arrivando.Solr: corrispondenza esatta delle partite più alta delle corrispondenze parziali

<field name="title" type="text_general" indexed="true" stored="true" multiValued="false"/> 

 

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Credo che il motivo che stanno ottenendo lo stesso punteggio è a causa della EdgeNGramFilterFactory impiegato in fase di indice. Ogni documento viene indicizzato come "La", "Lar", "Lark" con due dei documenti ("Larker" e "Larking") che vengono indicizzati con alcune varianti aggiuntive. Quindi in effetti ogni documento è una corrispondenza esatta per la query "Lark". Vorrei un modo per eseguire una query in cui il termine "Lark" restituirebbe tutti e tre i documenti ma con il documento "Lark" restituito più in alto degli altri.

Risultati della ricerca di debug:

<lst name="debug"> 
    <str name="rawquerystring">Lark</str> 
    <str name="querystring">Lark</str> 
    <str name="parsedquery">text:lark</str> 
    <str name="parsedquery_toString">text:lark</str> 
    <lst name="explain"> 
    <str name="543d6ee4cbb33c26bbcf288b/xxnullxx/543d6ef9cbb33c26bbcf2892"> 
2.7104912 = (MATCH) weight(text:lark in 0) [DefaultSimilarity], result of: 
    2.7104912 = fieldWeight in 0, product of: 
    1.4142135 = tf(freq=2.0), with freq of: 
     2.0 = termFreq=2.0 
    3.8332133 = idf(docFreq=3, maxDocs=68) 
    0.5 = fieldNorm(doc=0) 
</str> 
    <str name="543d6ee4cbb33c26bbcf288b/xxnullxx/543d6ef9cbb33c26bbcf2893"> 
2.7104912 = (MATCH) weight(text:lark in 1) [DefaultSimilarity], result of: 
    2.7104912 = fieldWeight in 1, product of: 
    1.4142135 = tf(freq=2.0), with freq of: 
     2.0 = termFreq=2.0 
    3.8332133 = idf(docFreq=3, maxDocs=68) 
    0.5 = fieldNorm(doc=1) 
</str> 
    <str name="543d6ee4cbb33c26bbcf288b/xxnullxx/543d6ef9cbb33c26bbcf2894"> 
2.7104912 = (MATCH) weight(text:lark in 2) [DefaultSimilarity], result of: 
    2.7104912 = fieldWeight in 2, product of: 
    1.4142135 = tf(freq=2.0), with freq of: 
     2.0 = termFreq=2.0 
    3.8332133 = idf(docFreq=3, maxDocs=68) 
    0.5 = fieldNorm(doc=2) 
</str> 
+1

È strano che si ottenga lo stesso punteggio per tutti e 3 i documenti. 'fieldNorm' dovrebbe essere il più basso per' Larking' e il più alto per 'Lark', quindi' Lark' dovrebbe ottenere il punteggio più alto. Puoi rieseguire la tua query con 'debugQuery = on & wt = xml' e verificare quale fieldNorm ottieni per ogni documento? – arun

+0

Aggiunto, @arun. 'fieldNorm' è lo stesso per tutti e tre. –

risposta

2

Per incrementare le corrispondenze esatte, è possibile creare un nuovo campo, chiamato "exact_title", con un nuovo tipo di "text_exact" che non ha l'EdgeNGramFilterFactory.

nello schema è possibile utilizzare la linea:

<copyField source="title" dest="exact_title"/> 

per copiare il titolo al exact_title.

Quindi eseguire la query su entrambi i campi, titolo e exact_title. Se la query corrisponde a un titolo esatto, il documento con quel titolo esatto riceverà un punteggio superiore rispetto ad altri documenti e salirà in cima.

0

Forse in ritardo, ma è anche possibile utilizzare KeywordRepeatFilterFactory senza creare un nuovo campo. Questo è il modo Solr documentation descrive che:

Una domanda ripetuta è "come posso avere il termine originale contribuire più al punteggio rispetto alla versione a stelo"? In Solr 4.3 è stato aggiunto KeywordRepeatFilterFactory per assistere questa funzionalità . Questo filtro emette due token per ciascun token di input, uno dei quali è contrassegnato con l'attributo Keyword. Gli stemmer che rispettano gli attributi della parola chiave passeranno attraverso il token così contrassegnato senza la modifica . Quindi l'effetto di questo filtro sarebbe quello di indicizzare sia la parola originale sia la versione con stemmed.

Problemi correlati