Çok basit bir durumda, "Lark", "Larker" ve "Larking" dosya adlarıyla üç dosyam var (dosya uzantısı yok). Solr olarak, dosya adını bir "başlık" alanına eşleyen bu üç belgeyi indekslerim. "Lark" için arama yaptığımda, üç belgenin tümü de (istediğim) döndürülür, ancak hepsine aynı puan verilir. "Lark" ın en yüksek skoru almasını tercih ederim, çünkü sorgumla tam olarak eşleşiyor, diğerleri geri geliyor. Solr: Tam eşleşmeleri kısmi eşleşmelerden yüksek puanlama
<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>
<field name="title" type="text_general" indexed="true" stored="true" multiValued="false"/>
onlar aynı puanı alıyorsanız nedeni endeks zamanda istihdam
EdgeNGramFilterFactory
ait olduğuna inanıyoruz. Her belge, bazı ek varyasyonlarla indekslenen iki belge ("Larker" ve "Larking") ile "La", "Lar", "Lark" olarak dizinlenir. Sonuç olarak, her belge "Lark" sorgusu için tam bir eştir. "Lark" teriminin üç belgenin tamamını döndüreceği, ancak "Lark" başlıklı belgenin diğerlerinden daha yüksek olduğu bir sorguyu yürütmenin bir yolunu kullanmak istiyorum. Sorgu hata ayıklama
Sonuçlar:
<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>
3 belgenin tümü için aynı puanı alıyor olmanız garip. fieldNorm, Larking için en düşük ve Lark için en yüksek değer olmalıdır, bu yüzden Lark en yüksek puanı almalıdır. Sorgunuzu 'debugQuery = on & wt = xml' ile yeniden çalıştırabilir ve her bir dokümana hangi alanda ulaştığınızı kontrol edebilir misiniz? – arun
Eklendi, @arun. FieldNorm, her üç için de aynıdır. –