Solr повысить запрос по значению поля и внутри самой новой даты
У нас есть следующая настройка в нашем schema.xml:
<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" omitTermFreqAndPositions="true"/>
...
<field name="prefix" type="string" indexed="true" stored="true" omitTermFreqAndPositions="true"/>
Нашей целью является сортировка документов по
- префикс =9999 с новыми документами (последними изменениями)
- префикс =1004 или префикс =1005 с новыми документами (последними изменениями)
Наш код:
{!boost b=recip(ms(NOW,last_modified),3.16e11,1,1)}prefix:9999^1000000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1004^600000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1005^600000
Результат: приведенный выше запрос не работает должным образом!
Мы думали, что omitTermFreqAndPositions=true заставит предотвращать ITF, и оценка должна работать. Но это не так! Пожалуйста, помогите нам с этим:-)
1 ответ
Решение
Итак, мы нашли решение!
- Создайте свое собственное сходство (простой Java-класс). Чтобы лучше и проще описать, как, пожалуйста, прочитайте Как скомпилировать пользовательский класс сходства для SOLR / Lucene с использованием Eclipse.
Класс, который мы использовали
package com.luxactive;
import org.apache.lucene.index.FieldInvertState;
import org.apache.lucene.search.similarities.DefaultSimilarity;
public class MyNewSimilarityClass extends DefaultSimilarity {
@Override
public float coord(int overlap, int maxOverlap) {
return 1.0f;
}
@Override
public float idf(long docFreq, long numDocs) {
return 1.0f;
}
@Override
public float lengthNorm(FieldInvertState arg0) {
return 1.0f;
}
@Override
public float tf(float freq) {
return 1.0f;
}
}
- Создайте простую банку с вашим сходством
- Скопируйте банку в любую папку на свой сервер Solr, мы использовали:
SOLRFOLDER/solr-4.8.0/example/solr/dih
Следующие шаги нужно сделать для каждой вашей коллекции!
- Отредактируйте файл solrconfig.xml по адресу:
SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml
добавлять<lib dir="../dih" regex=".*\.jar" />
импортировать нестандартную банку - Отредактируйте файл schema.xml в той же папке
Добавьте следующее
<!-- DEFAULT Factory for custom com.luxactive.MyNewSimilarityClass -->
<similarity class="solr.SchemaSimilarityFactory"/>
<!-- TYPE String -->
<fieldType name="no_term_frequency_string" class="solr.StrField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
<!-- TYPE Date -->
<fieldType name="no_term_frequency_date" class="solr.TrieDateField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
<!-- TYPE Int-->
<fieldType name="no_term_frequency_int" class="solr.TrieIntField" sortMissingLast="true" >
<similarity class="com.luxactive.MyNewSimilarityClass"/>
</fieldType>
Здесь вы определяете свои собственные типы полей (int, string и date), которые используют новый класс Similarity, который будет возвращать значение повышения, как определено в MyNewS SimilarityClass.
- Теперь отредактируйте поля, которые вы хотите использовать в своем подобном подобии, установив их тип, который вы создали.
От:<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" />
Для того, чтобы:<field name="last_modified" type="no_term_frequency_date" indexed="true" stored="true" multiValued="false" />
- Перезапустите сервер Solr и наслаждайтесь бустингом:)