2016-02-26 3 views
1

Tl; dr: Как я могу заставить Solr 4 игнорировать диакритические знаки при сортировке значений фасета?Игнорирование диакритики при сортировке значений фасета в Solr 4

Я добавил следующие четыре документа в "collection1" ядра Solr по умолчанию в Solr, например в:

<doc> 
    <field name="id">1</field> 
    <field name="cat">manuka</field> 
    <field name="cat">mystery</field> 
</doc> 
<doc> 
    <field name="id">2</field> 
    <field name="cat">mānuka</field> 
    <field name="cat">stuff</field> 
</doc> 
<doc> 
    <field name="id">3</field> 
    <field name="cat">management</field> 
    <field name="cat">stuff</field> 
</doc> 
<doc> 
    <field name="id">4</field> 
    <field name="cat">abc</field> 
    <field name="cat">stuff</field> 
</doc> 

Поле "кошки" определяется как:

<field name="cat" type="string" indexed="true" stored="true" multiValued="true"/> 

а типа «строка» определяется как:

<fieldType name="string" class="solr.StrField" sortMissingLast="true" /> 

Когда я фаской запрос на поле «кошки», отсортированный по значению (http://localhost:8983/solr/collection1/select?q=*%3A*&rows=0&wt=json&indent=true&facet=true&facet.field=cat&facet.sort=index), я получаю:

.... 
"facet_fields":{ 
    "cat":[ 
    "abc",1, 
    "management",1, 
    "manuka",1, 
    "mystery",1, 
    "mānuka",1, 
    "stuff",3]}, 
.... 

Обратите внимание, что Манука приходит после того, как тайна. Я хотел бы, чтобы манука пришла после мануки и перед материалом, то есть я хотел бы, чтобы этот вид игнорировал диакритические знаки, включая макрон.

Если это был поиск без фасета, похоже, я мог бы достичь того, чего хочу, установив Collation для отдельного поля копирования и отсортировав его (я не могу настроить сортировку для самого поля, потому что сохраненный данные будут двоичным представлением ключа сортировки). Однако похоже, что этот подход невозможен для запросов фасетов, поскольку их можно сортировать только по индексу или счету.

Я что-то пропускаю? Есть ли какой-то трюк, чтобы заставить это работать в среде, где мне нужно отображать значение поля «cat»?

ответ

0

Вопрос только в том, чтобы настроить индексный порядок фасета.

Ваше предложение должно использовать Collation. Вы можете сделать это, и порядок ваших аспектов будет правильным. Проблема в том, что ни CollationField, ни ICUCollationField не переопределяют indexedToReadable method.

Два класса не могут переопределить indexedToReadable, потому что в общем случае отображение от слова к термину не обратимо. Но для вашего случая вы можете реализовать подкласс ICUCollationField, который будет переоценить indexedToReadable.

Ваша отправная точка может быть TestICUCollationField с

<fieldType name="sort_fr_t" class="solr.ICUCollationField" locale="fr" strength="primary"/> 
    ... 
    <field name="sort_fr" type="sort_fr_t" indexed="true" stored="true" docValues="true" multiValued="true"/> 

, как вы увидите в этом случае имена значений фасета очень нечитаемые.

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