Проблема в использовании Solr WordDelimiterFilter - PullRequest
0 голосов
/ 18 июля 2011

Я делаю какой-то тест, используя WordDelimiterFilter в Solr, но он не сохраняет защищенный список слов, которые я передаю ему. Не могли бы вы проверить код и пример вывода и предложить, какая часть отсутствует или используется плохо?

с запуском этого кода:

private static Analyzer getWordDelimiterAnalyzer() {
    return new Analyzer() {
        @Override
        public TokenStream tokenStream(String fieldName, Reader reader) {
            TokenStream stream = new StandardTokenizer(Version.LUCENE_32, reader);
            WordDelimiterFilterFactory wordDelimiterFilterFactory = new WordDelimiterFilterFactory();
            HashMap<String, String> args = new HashMap<String, String>();
            args.put("generateWordParts", "1");
            args.put("generateNumberParts", "1");
            args.put("catenateWords", "1");
            args.put("catenateNumbers", "1");
            args.put("catenateAll", "0");
            args.put("luceneMatchVersion", Version.LUCENE_32.name());
            args.put("language", "English");
            args.put("protected", "protected.txt");
            wordDelimiterFilterFactory.init(args);
            ResourceLoader loader = new SolrResourceLoader(null, null);
            wordDelimiterFilterFactory.inform(loader);
            /*List<String> protectedWords = new ArrayList<String>();
            protectedWords.add("good bye");
            protectedWords.add("hello world");
            wordDelimiterFilterFactory.inform(new LinesMockSolrResourceLoader(protectedWords));
            */
            return wordDelimiterFilterFactory.create(stream);
        }
    };
}

ввод текста:

Привет, мир

до свидания

каков твой план на будущее?


защищенные строки:

до свидания

Привет, мир


* * Тысяча двадцать-одина выход:

(Привет, startOffset = 0, endOffset = 5, positionIncrement = 1, тип =)

* * +1025 (мир, startOffset = 6, endOffset = 11, positionIncrement = 1, тип =)

(хорошо, startOffset = 12, endOffset = 16, positionIncrement = 1, тип =)

* 1 029 * (до свидания, startOffset = 17, endOffset = 20, positionIncrement = 1, тип =)

(что, startOffset = 21, endOffset = 25, positionIncrement = 1, тип =)

(это, startOffset = 26, endOffset = 28, positionIncrement = 1, тип =)

(ваше, startOffset = 29, endOffset = 33, positionIncrement = 1, тип =)

* +1037 * (план, startOffset = 34, endOffset = 38, positionIncrement = 1, тип =) * +1039 * (для, startOffset = 39, endOffset = 42, positionIncrement = 1, тип =)

(будущее, startOffset = 43, endOffset = 49, positionIncrement = 1, тип =)

1 Ответ

0 голосов
/ 18 июля 2011

Вы используете стандартный токенизатор, который по крайней мере токенизирует на уровне пробелов, поэтому у вас всегда будет "hello world", который будет разделен на "hello" и "world".

TokenStream stream = new StandardTokenizer(Version.LUCENE_32, reader);

См. Документацию Lucene:

открытый финальный класс StandardTokenizer расширяет Tokenizer

Основанный на грамматике токенизатор, созданный с использованием JFlex

Это должен быть хороший токенизатор для большинства документов на европейском языке:

Разбивает слова на знаки препинания, удаляя знаки препинания.Однако точка, за которой не следует пробел, считается частью токена.

Разбивает слова на дефисы, если в токене нет числа, и в этом случае весь токен интерпретируется как номер продукта и неsplit.

Распознает адреса электронной почты и имена хостов в Интернете как один токен.

Список слов, защищенных разделителем слов, предназначен для чего-то вроде:

  • ISBN2345677 длябыть разбитым в ISBN 2345677
  • text2html, чтобы не разбиваться на текст 2 html (потому что text2html был добавлен к защищенным словам)

Если вы действительно хотите сделать что-то, как вы упомянули, вы можетеиспользуйте KeywordTokenizer .Но вы должны сделать полное разделение самостоятельно.

...