Структура данных для поисковой системы в JAVA? - PullRequest
1 голос
/ 13 октября 2009

Я студент второго курса MCS. Я делаю проект на Java, в котором у меня есть разные изображения. Для хранения описания, скажем, IMAGE-1, у меня есть ArrayList с именем IMAGE-1, аналогично для IMAGE-2 ArrayList IMAGE-2 n, так далее .....

Теперь мне нужно разработать поисковую систему, в которой мне нужно найти все изображения, описание которых соответствует слову, введенному в поисковой системе ..........

FOR EX Если я введу «компьютер», я смогу найти все изображения, описание которых содержит «компьютер».

Так что мой вопрос ...

Как мне сделать это эффективно?
Как я должен поддерживать все эти ArrayList, так как я могу иметь 100 такое ...? или я должен использовать другой структура данных вместо ArrayList?

Ответы [ 4 ]

2 голосов
/ 13 октября 2009

Простая реализация - токен описания и использование Map<String, Collection<Item>> для хранения всех предметов для токена.

Строительство:

for(String token: tokenize(description)) map.get(token).add(item)

(Коллекция необходима, поскольку для токена можно найти несколько записей. Инициализация коллекции отсутствует в коде. Но идея должна быть ясной.)

Использование:

List<Item> result = map.get("Computer")

В этом случае реализация HashMap общего назначения не самая эффективная. Когда у вас начнутся проблемы с памятью, вы можете рассмотреть более эффективную реализацию дерева (например, radix trees - реализация ).

Следующим шагом может быть использование некоторой (в памяти) базы данных. Они могут быть реляционными ( HSQL ) или нет ( Berkeley DB ).

1 голос
/ 13 октября 2009

Если у вас есть небольшое количество изображений и кратких описаний (<1000 символов), загрузите их в массив и выполните поиск слов, используя <code>String.indexOf() (то есть одна запись в массиве == одно полное описание изображения). Это достаточно эффективно, скажем, для менее чем 10 000 изображений.

Используйте toLowerCase(), чтобы сложить регистр символов (чтобы пользователи находили «Компьютер» при вводе «компьютера»). String.indexOf() также будет работать для коротких слов (используя «comp», чтобы найти «Computer» или «сравнить»).

Если у вас много изображений и длинных описаний и / или вы хотите предоставить своим пользователям некоторые удобства для поиска (как это делает Google), тогда используйте Lucene .

1 голос
/ 13 октября 2009

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

Но нужна ли вам эффективность? Это настольное приложение или веб-приложение? В первом случае не беспокойтесь об эффективности: современный процессор может выполнять поиск в мегабайтах текста за доли секунды - просто просматривайте все описания, используя String.contains() (или регулярное выражение, чтобы обеспечить более гибкий поиск).

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

Что касается ваших ArrayLists, кажется странным использовать один для описания одного изображения. Почему список, что представляет индекс? Линии? Если это так, и если вам действительно не нужен прямой доступ к строкам, замените списки простой строкой - она ​​может содержать символы новой строки просто отлично.

0 голосов
/ 13 октября 2009

Я бы предложил вам использовать класс Hashtable или организовать ваш контент в виде дерева для оптимизации поиска.

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