Поддержка преобразования букв Solr / Умлаутс - PullRequest
4 голосов
/ 17 октября 2011

Я использую Solr 3.x с акцентом на немецкий текст, который работает хорошо. Поиск умлаутов (öäüß) также хорошо работает.

Проблема в следующем: Я получил некоторый заархивированный текст с конца 80-х годов, когда большая часть компьютера / программного обеспечения не поддерживала больше, чем ASCII, особенно немецкие умлауты не поддерживались. Для этого была использована альтернативная запись:

ae instead of ä
oe instead of ö
ue instead of ü
ss instead of ß

Это означает, что имя Müller было сохранено как Mueller.

Возвращаясь к Solr, мне нужно найти документы, которые содержат ue - даже если пользователь искал ü.

Пример: если мне нравится искать все текстовые сообщения от человека по имени Müller, Solr должен найти текст с помощью Mueller, а также Müller

Как я могу справиться с этим?

Это адекватная функция? -> http://wiki.apache.org/solr/UnicodeCollation (я не уверен, полностью ли я понимаю документацию)

Кстати, нельзя изменить исходный текст с помощью «поиска и замены»: все oe на ö.

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Как уже указала Пейдж Кук, вы уже нашли соответствующую документацию , но, поскольку не каждый пользователь Solr знает Java, я решил создать свой собственный ответ с более подробной информацией.

Первый шаг - добавить фильтр к определению вашего поля:

<fieldType>
  <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <!-- BEGIN OF IMPORTANT PART -->
    <filter class="solr.CollationKeyFilterFactory"
        custom="customRules.bin"
        strength="primary"
    />
    <!-- END OF IMPORTANT PART -->
  </analyzer>
</fieldType>

Следующим шагом является создание необходимого customRules.bin файла:

Вы должны создать крошечную Java-программу, чтобы следовать документации. К сожалению, для не Java-программистов это немного сложно, так как фрагмент кода показывает только важные части. Также он использует стороннюю библиотеку, не распространяемую с JDK (Apache Commons IO)

Вот полный Java 7 код, необходимый для написания customRules.bin без использования внешних библиотек:

import java.io.*;
import java.text.*;
import java.util.*;

public class RulesWriter {

    public static void main(String[] args) throws Exception {

        RuleBasedCollator baseCollator = (RuleBasedCollator) 
                Collator.getInstance(new Locale("de", "DE"));

        String DIN5007_2_tailorings =
          "& ae , a\u0308 & AE , A\u0308"+
          "& oe , o\u0308 & OE , O\u0308"+
          "& ue , u\u0308 & UE , u\u0308";

        RuleBasedCollator tailoredCollator = new RuleBasedCollator(
                baseCollator.getRules() + DIN5007_2_tailorings);
        String tailoredRules = tailoredCollator.getRules();

        Writer fw = new OutputStreamWriter(
                new FileOutputStream("c:/customRules.dat"), "UTF-8");
        fw.write(tailoredRules);
        fw.flush();
        fw.close();
    }
}

Отказ от ответственности: Приведенный выше код компилируется и создает файл customRules.bin, но я фактически не проверял созданный файл с помощью Solr.

1 голос
/ 17 октября 2011

Исходя из моей интерпретации предоставленной вами ссылки на функцию сортировки Unicode, это абсолютная функция, поскольку она показывает, как решить точно такую ​​же проблему , которая у вас возникла.

Похоже, вы захотите написать немного Java для создания соответствующего файла customRules.dat.

...