2014-10-14 20 views
6

Ç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> 
+1

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

+0

Eklendi, @arun. FieldNorm, her üç için de aynıdır. –

cevap

2

kesin eşleşmeleri artırmak için, EdgeNGramFilterFactory sahip olmayan yeni bir tür "text_exact" ile "exact_title" adlı yeni bir alan, oluşturabilir. exact_title başlığı kopyalamak için

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

: En şemada

sen satırını kullanabilirsiniz. Ardından sorgunuzu her iki alana, başlığa ve tamsayıya karşı çalıştırın. Sorgunun tam bir başlıkla eşleşmesi durumunda, söz konusu tam başlıkya sahip belge diğer belgelere göre daha yüksek bir puan alır ve en üste çıkacaktır.

0

Belki de geç ancak KeywordRepeatFilterFactory'u yeni bir alan oluşturmadan da kullanabilirsiniz.

bir tekrarlanan soru, "Ben orijinal terim var nasıl saplı sürümden daha puanına fazla katkıda" dir: Bu Solr documentation olduğunu açıklar nasıl? Solr 4.3'te, bu işlevine yardımcı olmak için KeywordRepeatFilterFactory eklenmiştir. Bu filtre, her bir giriş belirteci için iki jeton çıkarır; bunlardan bir , Anahtar Kelime özelliğiyle işaretlenir. anahtar kelime özniteliklerine saygılı köprüler, değişikliği olmadan işaretlenen belirtecin içinden geçecektir. Bu nedenle, bu filtrenin etkisi, orijinal sözcüğünü ve kaynaklanmış sürümü endekslemek olacaktır.