2015-08-09 4 views
-2

У меня есть набор объектов в java (около 10M +), что я хочу - это структура данных, которую я могу сделать в полном тексте. Поиск по TITLE этих объектов и результатов для сортировки предпочтительным образом ,Лучший алгоритм для текстового поиска

Что я хочу - это производительность, не беспокойтесь о емкости памяти.

То, что я пытался сделать сейчас, это иметь HashMap из ArrayLists этих объектов. Всякий раз, когда новый объект вставлен, заголовок наплевается на его Слова, и объект добавляется в соответствующий ArrayList для всех слов на карте.

Когда требуется поиск, фраза поиска разделяется словами и доступна для всех ArrayLists, а массивы ArrayLists объединяются и удаляются дубликаты и сортируются.

, но для объектов 1M требуется около 1 секунды. есть ли способ увеличить производительность этого поиска?

+0

Вы правы, что кажется, что вы должны быть в состоянии его оптимизировать. Точно как зависит от того, как вы его реализовали. Я бы начал с рассмотрения вашего процессора и профиля памяти. Кстати, вы используете несколько потоков? –

ответ

0

Я бы рекомендовал использовать Lucene, или Elasticsearch. Они идеально подходят для этого прецедента, высоко оптимизированы и предлагают вам множество других полезных функций, которые вам могут понадобиться (например, нечеткие совпадения, управление индексами, очертание и многое другое).

Если вы настроены рулон самостоятельно, структура данных, которую вы описываете, в значительной степени Google's HashMultimap. Чтобы оптимизировать это, я думаю, вам нужно посмотреть, на какое время тратится время. Запрос HashMap должен быть O (1), поэтому, скорее всего, это слияние и сортировка, которые замедляют работу. - сортировки могут быть довольно медленными, в зависимости от используемого вами Comparator.

Имейте в виду, что именно то, что нужно настроить, будет зависеть от статистических свойств ваших запросов - если они обычно возвращают только один или два результата, что делает сортировку эффективной пустой тратой времени.

+0

Здравствуйте, Спасибо за быстрый ответ. Я использовал Lucene, проблема с lucene заключается в том, что она не обеспечивает функциональность как «% LIKE%», не так ли ?. Я искал документы, но не смог найти их –

+0

Sure! https://lucene.apache.org/core/2_9_4/queryparsersyntax.html#Wildcard%20Известки ElasticSearch тоже: https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-matching.html – hugh

+0

Хорошо, большое спасибо :) –

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