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>
È 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
Aggiunto, @arun. 'fieldNorm' è lo stesso per tutti e tre. –