2015-03-04 2 views
0

В Solr 4. *, предположим, у меня есть поле "mytext".Solr: Как решить этот случай пользователя

  1. Первая запись в "mytext" является "working at ABC".

  2. Вторая запись в категории "mytext" есть "working at ABC project ABC".

Теперь, когда я ищу "Working at ABC", то последовательность документов

Doc 1: "Working at ABC project ABC"

Doc 2: "Working at ABC"

Хотя по расчетам это имеет смысл, второй документ должен быть сверху, потому что он содержит «ABC» дважды (TF выше для второго документа).

Но с точки зрения пользователя, когда запрос, введенный "работает на ABC" результат должен быть

"Working at ABC" 

"Working at ABC project ABC" 

.

Как справиться с такими сценариями. Этот проект возникает только тогда, когда «Компания» и «Проект» имеют перекрывающиеся данные. Как в этом случае его «ABC».

Благодаря

Amit Аггарваль

+0

вы должны спросить себя, почему doc2 должны иметь более высокий ранг? это имеет больше смысла для пользователя, но почему? в противном случае вы будете продолжать циклы, а в другом случае у вас будет противоположный случай. – Emad

+0

вы всегда можете переопределить класс подобия в файле схемы и предоставить свою собственную реализацию для расчета TF, IDF, норм и т. Д. Что я обычно делаю, когда есть странный случай. – Emad

ответ

0

Вы можете установить omitTermFreqsAndPositions=true для поля. До тех пор, пока включены нормы, поля с более коротким содержанием будут ранжироваться выше, чем те, у которых более длинный контент.

+0

Я буду reindex solr с этим полем .. Я думаю, что это может быть мой ответ ... Я дам вам знать .. спасибо – voila

0

Вместо смены schema.xml. Я перезаписываю функцию TF, которая всегда возвращает 1. Таким образом, влияние временной частоты не влияет.

Если в случае, если кто использует Solr на коротких полях, то вот мой собственный класс

private static float ARR[] = { 0.0f, 1.5f, 1.25f, 1.0f, 0.875f, 0.75f, 0.625f, 0.5f, 0.4375f, 0.375f, 0.3125f}; 

    /** 
    * Implemented as a lookup for the first 10 counts, then 
    * <code>1/sqrt(numTerms)</code>. This is to avoid term counts below 
    * 11 from having the same lengthNorm after being stored encoded as 
    * a single byte. 
    */ 
    public float lengthNorm(FieldInvertState state) { 
    int numTerms = state.getLength(); 
    String fieldName = state.getName(); 

    System.out.println("field is " + fieldName + " number of terms are " + numTerms); 
    if(numTerms <= 10) { 
     // this shouldn't be possible, but be safe. 
     if(numTerms < 0) { numTerms = 0; } 

     return ARR[numTerms]; 
    } 
    //else 
    return (float)(1.0/Math.sqrt(numTerms)); 
    } 

    // For short fields , term frequency does not always lead to relevancy so returning 1.0 
    @Override 
    public float tf(float freq) { 
     return (float) 1.0; 
    } 
Смежные вопросы