Индексирование текстов со многими номерами в Lucene - PullRequest
3 голосов
/ 19 января 2011

Можно ли создать термин для каждого числа в тексте?Пример текста:

I got 2295910 unique terms.

Числа могут быть временными метками, номерами портов и так далее.Уникальные числа приводят к очень большому количеству уникальных терминов.Неправильно иметь такое же количество уникальных терминов, как документы.Использование памяти Lucene растет с увеличением количества уникальных терминов .

Существует ли специальный анализатор или трюк для текстов с числами?StandardAnalyzer создает термин для каждого уникального номера.

Потребности:

Номера должны оставаться доступными для поиска.В документе может быть несколько номеров.Использование памяти является проблемой.У меня есть 800 миллионов документов в нескольких каталогах индекса.Использование памяти вынуждает меня закрыть наименее недавно использованные IndexSearchers.

Неопробованные идеи:

  • Использовать специальный анализатор.Было бы разбить числа на куски.123456 станет 123456.Парсер запросов будет использовать поиск по фразе, чтобы найти число.
  • Измените код Lucene, чтобы использовать более крупный termInfosIndexDivisor при просмотре числовых терминов.

Возможно, я заново изобретаю колесо.Кто-то уже решил это?

Ответы [ 3 ]

3 голосов
/ 19 января 2011

У вас сейчас проблемы с памятью? Это правда, что использование памяти Lucene растет с увеличением количества уникальных терминов, но это все еще относительно небольшой объем памяти даже для индексов, которые имеют много терминов.

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

1 голос
/ 19 января 2011

Ответ зависит от ваших потребностей.

Вам нужен поиск по этим терминам? Если вам нужно выполнить поиск по этим условиям, то это просто характер вашего поискового индекса. Есть некоторые приемы, которые вы можете сделать, если вам не нужно искать точные значения (например, поиск по диапазону), но если вам нужны точные совпадения, то вы застряли с этим.

Если вам не нужно искать эти термины, зачем их индексировать?

1 голос
/ 19 января 2011

Как говорит Бахафреш: преждевременная оптимизация - корень всего зла.Но предположим, что это действительно проблема:

Один из вариантов - дублировать поле и анализировать один раз, выбрасывая числа, а другой - выбрасывать все, кроме чисел, а затем индексировать последнее как числовое поле.Числовые поля имеют механизм специальное хранилище , что означает, что будет сохранено только очень немного уникальных терминов (обычно менее 256, за счет некоторой точности).

Конечно, этобудет означать, что запросы фраз не будут работать, но другие типы все равно должны быть в порядке (при условии, что вы запутались в парсере запросов, чтобы заставить его работать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...