2015-12-07 4 views
2

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

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

Спасибо!

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

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

+0

Можете ли вы привести пример того, чего вы хотите достичь? Например. входные данные, запрос и результат этого запроса. –

+0

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

+0

Вот пример того, что вы ищете в [Javadocs] (http://lucene.apache.org/core/5_3_0/core/org/apache/lucene/analysis/package-summary.html) – user1071777

ответ

2

Следует использовать специальный анализатор с параметром 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(); 

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

+0

Спасибо , это работало как шарм! Знаете ли вы, можно ли использовать абсолютный/относительный путь для стоп-слов? Раньше я создал StandardAnalyzer (CharArraySet) для стоп-слов и мог указать и файл, который я хотел. Теперь то же самое не работает, но только для файлов-стопок, которые находятся в одном каталоге. –

+1

Вы должны создать строитель, предоставив путь к каталогу ресурсов, например. 'CustomAnalyzer.builder (Paths.get (" your_resources_dir "))' –

+0

Спасибо, это снова сработало! –