2015-12-03 3 views
1

Я обнаружил, что Lucene не будет индексировать непроанализированное поле, если оно слишком велико (выглядит как предел 16kb).Lucene не индексирует большие, неанализированные поля

В моем приложении я ищу, например. " *что нибудь* ". Это прекрасно работает и находит мой документ. Если я увеличиваю размер текста, более 16 КБ, поиск перестанет его искать.

Вот как добавляется поле ...

String property = ... 
String value = ... 
Field field = new Field(property, value, Field.Store.NO, Field.Index.NOT_ANALYZED); 

Из-за ошибки в затмении я не могу отлаживать код Lucene (в настоящее время, установка NetBeans!) Так интересно, если кто-нибудь знает, где предел и если его можно увеличить?

И прежде, чем кто-либо предложит не использовать NOT_ANALYZED или сократить текст, это в конвейере!

+0

В Lucene действительно существует предел для неанализируемых полей. Точнее, существует ограничение на длину одного термина (см. [IndexWriter # MAX_TERM_LENGTH] (http://lucene.apache.org/core/5_3_0/core/org/apache/lucene/index/IndexWriter.html# MAX_TERM_LENGTH)). Разумеется, вы можете анализировать текст с помощью соответствующего анализатора и основывать свой поиск на этом. – user1071777

ответ

1

Я знаю, что вы сказали, чтобы не предложить, но:

Не используйте NOT_ANALYZED для поиска длинные, полные текстовые поля.

Индексирование долго, полнотекстовый поле как NOT_ANALYZED, а затем поиск с двойным групповым символом означает, что вы не получаете абсолютно никакой пользы из возможностей полнотекстового поиска Lucene в. Такая реализация - всего лишь иллюзионовое, экстраординарное linear search. Вы можете точно хранить все свои данные в текстовом файле и искать совпадение по одному символу за раз.

Изменение этого жесткого предельного размера будет сложным, я считаю. Его нужно будет изменить в аргументе DocumentsWriter, и комментарии указывают, что реализация кэша поля должна быть изменена. Не стоит заглядывать далеко вперед, чтобы использовать чрезмерно сложный линейный поиск.

Вы говорите, что анализ находится в стадии разработки, но он имеет решающее значение для эффективного поиска с помощью lucene. Это не крутая возможность добавить позже, это то, что вы должно есть. Только начинайте с StandardAnalyzer и уточняйте, там, где это необходимо.

+0

Я знаю, я знаю, я знаю ... :) У нас есть аналитическая версия, это устаревшая поддержка. Вы знаете, где константа/комментарии, чтобы я мог посмотреть? – TedTrippin

+0

Никоим образом вы не можете немного похудеть на устаревшем материале и отрезать его (или разделить на два термина), прежде чем он станет слишком длинным? Конечно, я * думаю * вам нужно будет создать свой собственный impl 'DocumentsWriterPerThread', изменив' MAX_TERM_LENGTH_UTF8' ([см. Здесь] (http://grepcode.com/file/repo1.maven.org/maven2/org. apache.lucene/Lucene-ядро/5.2.1/орг/Apache/Lucene/индекс/DocumentsWriterPerThread.java # DocumentsWriterPerThread.0MAX_TERM_LENGTH_UTF8)). Не знаете, какие побочные эффекты вы будете модифицировать, но это точно похоже на ограничение по причине. Удачи с этим, хотя! – femtoRgon

+0

Я не мог найти никаких обычаев, но комментарий, безусловно, звучит как первопричина. Благодарю. – TedTrippin

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