2010-07-17 4 views
1

Я пытаюсь обновить поиск условий документов в моем индексе Lucene. В настоящее время результаты поиска оцениваются по количеству раз, которое термин появляется в документе. То, что я хотел бы сделать, это оценка, если этот термин существует, а не количество раз, когда этот термин существует. Таким образом, документ с термином в нем однажды оценивает то же, что и документ с термином в нем 100 раз.Zend_Search_Lucene изменение частоты проблемы частоты

Я попытался расширить Zend_Search_Lucene_Search_Similarity своим собственным классом, но, честно говоря, я не уверен, что это работает правильно, поскольку оценки все еще довольно низкие.

class MySimilarity extends Zend_Search_Lucene_Search_Similarity{ 

//override the default frequency of searching 
public function tf($freq){ 
    return 1.0; 
} 

public function lengthNorm($fieldName, $numTerms) { 
    return 1.0/sqrt($numTerms); 
} 

public function queryNorm($sumOfSquaredWeights) { 
    return 1.0/sqrt($sumOfSquaredWeights); 
} 

public function sloppyFreq($distance) { 
    return 1.0; 
} 

public function idfFreq($docFreq, $numDocs) { 
    return log($numDocs/(float)($docFreq+1)) + 1.0; 
} 

public function coord($overlap, $maxOverlap) { 
    return $overlap/(float)$maxOverlap; 
} 
} 

Теперь это построено из примеров, которые я нашел при поиске старых добрых Google. Однако единственное реальное изменение, которое я сделал, было связано с функцией tf().

Любая помощь с этим, и я буду очень благодарен, поскольку на данный момент это действительно испортило мои поиски.

Спасибо,

Грант

ответ

0

Я хотел бы попробовать две вещи для отладки это:

  1. Построить действительно маленький индекс - два документа, одно поле в каждом, первое, имеющее слово «лодка», а вторая фраза «лодочная лодка». Проверьте свой поиск.
  2. Попробуйте переопределить только функцию tf(). Это изменение, которое вы хотите. Переопределение других частей, таких как норма, требует переиндексации с использованием новой функции сходства. Убедитесь, что вам действительно нужно это, прежде чем переиндексировать.

В целом, изменение функции tf() кажется правильным. Это при условии, что вам нужен только относительный порядок и не волнует абсолютный балл.

+0

Что было бы лучшим способом получить абсолютный балл? Будет ли это idfFreq() ??? Спасибо, Грант –

+1

Зачем нужен абсолютный бал? Предлагаю вам ознакомиться с http://lucene.apache.org/java/2_4_0/scoring.html и http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Similarity .html Java Lucene имеет удобную функцию explain(), которая описывает, почему документ получил свою оценку. Я не мог найти его в Zend, но вам может быть повезло больше. В любом случае, для поиска вам нужен только правильный порядок документов, поэтому относительная оценка важна. –

+0

Поблагодарите Юваля, эти документы указали мне в правильном направлении. –

Смежные вопросы