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"/>

Нашей целью является сортировка документов по

  1. префикс =9999 с новыми документами (последними изменениями)
  2. префикс =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 ответ

Решение

Итак, мы нашли решение!

  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;
}

}
  1. Создайте простую банку с вашим сходством
  2. Скопируйте банку в любую папку на свой сервер Solr, мы использовали: SOLRFOLDER/solr-4.8.0/example/solr/dih

Следующие шаги нужно сделать для каждой вашей коллекции!

  1. Отредактируйте файл solrconfig.xml по адресу: SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml
    добавлять <lib dir="../dih" regex=".*\.jar" /> импортировать нестандартную банку
  2. Отредактируйте файл 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.

  1. Теперь отредактируйте поля, которые вы хотите использовать в своем подобном подобии, установив их тип, который вы создали.
    От: <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" />
  2. Перезапустите сервер Solr и наслаждайтесь бустингом:)
Другие вопросы по тегам