Как индексировать только слова минимальной длины с помощью Apache Lucene 5.3.1?

может кто-нибудь подсказать, как индексировать только слова минимальной длины с помощью Apache Lucene 5.3.1?

Я просмотрел API, но не нашел ничего, что соответствовало бы моим потребностям, кроме это, но я не мог понять, как это использовать.

Спасибо!

Редактировать: я думаю, что это важная информация, поэтому вот копия моего объяснения того, чего я хочу достичь из моего ответа ниже:

«Я не собираюсь использовать запросы. Я хочу создать инструмент для обобщения исходного кода, для которого я создал матрицу терминов документа с помощью Lucene. Теперь он также показывает односимвольные или двухсимвольные слова. Я хочу исключить их, чтобы они не отображаются в результатах, так как они не имеют большого значения для сводки. Я знаю, что могу отфильтровать их при выводе результатов, но это не чистое решение imo. Еще хуже было бы добавить все комбинации одинарных или двойных -символьные слова в стоп-лист. Я надеюсь, что есть более элегантный способ, чем один из этих».


person Jdv    schedule 07.12.2015    source источник
comment
Можете ли вы привести пример, чего вы хотите достичь? Например. входные данные, запрос и результат этого запроса.   -  person Alexander Kuznetsov    schedule 07.12.2015
comment
Я не собираюсь использовать запросы. Я хочу создать инструмент суммирования исходного кода, для которого я создал матрицу терминов документов с помощью Lucene. Теперь он также показывает слова, состоящие из одного или двух символов. Я хочу исключить их, чтобы они не отображались в результатах, поскольку они не имеют большого значения для сводки. Я знаю, что могу отфильтровать их при выводе результатов, но это не чистое решение. Еще хуже было бы добавить в стоп-лист все комбинации односимвольных или двухсимвольных слов. Я надеюсь, что есть более элегантный способ, чем один из них.   -  person Jdv    schedule 08.12.2015
comment
Пример того, что вы ищете, есть в Javadocs   -  person user1071777    schedule 08.12.2015


Ответы (1)


Вы должны использовать собственный анализатор с LengthTokeFilter. Например.

Analyzer ana = CustomAnalyzer.builder()
                .withTokenizer("standard")
                .addTokenFilter("standard")
                .addTokenFilter("lowercase")     
                .addTokenFilter("length", "min", "4", "max", "50")
                .addTokenFilter("stop", "ignoreCase", "false", "words", "stopwords.txt", "format", "wordset")
                .build();

Но лучше использовать стоп-слова (слова, которые встречаются практически во всех документах, например статьи для английского языка). Это дает более точный результат.

person Alexander Kuznetsov    schedule 08.12.2015
comment
Спасибо, это сработало как шарм! Знаете ли вы, можно ли использовать абсолютный/относительный путь для стоп-слов? Раньше я создал StandardAnalyzer(CharArraySet) для стоп-слов и мог указать нужный мне файл. Теперь то же самое не работает, но только для файлов со стоп-словами, которые находятся в том же каталоге. - person Jdv; 11.12.2015
comment
Вы должны создать билдер, указав путь к каталогу ресурсов, например. CustomAnalyzer.builder(Paths.get("your_resources_dir")) - person Alexander Kuznetsov; 11.12.2015