2009-10-13 5 views
1

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

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

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

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

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

ответ

0

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

+0

-1 Hashtable устарел с Java 1.2 и не имеет ничего общего с деревьями. –

+0

Я не работал с Java в прошлом году. Я только что проверил документ: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html Не упоминается об устаревании или обструкции. Док был из 1.4.2. Я видел совет по использованию HashMap в Java 1.6. Деревья не были непосредственно связаны с хэш-таблицами, но представляли собой альтернативу. Например, посмотрите: http://stackoverflow.com/questions/823744/ternary-tree-vs-hash-table –

1

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

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

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

+1

Люцен - слон, поверьте мне. Но действительно стоит попробовать. –

+0

Спасибо ... но описание может быть довольно большим, то есть более 1000 строк, поэтому можно сохранить его в простом массиве? – 2009-10-13 09:26:51

+0

В чем проблема с использованием строки? –

1

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

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

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

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

+0

Это странный подход. Попробуйте грубую силу. Если это не удается использовать эту гигантскую библиотеку (Lucene). В середине есть одно или два решения. –

+0

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

+0

Одним из упрощенных решений может быть: tokenize description, for (токен: tokenize (descr)) map.put (токен, элемент). Это сгорит память, но может быть допустимым решением. В зависимости от ограничений. –

2

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

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

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

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

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

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

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

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

+0

Вы ничего нового не говорите. Смотрите мой пост. –

+0

Я не понял, что вы пытаетесь сказать: tag! = Токен. Если он называется тегом, он должен быть тегом (http://en.wikipedia.org/wiki/Tag_%28metadata%29). Пометка звучит как пользователь, делающий деление, связанные с элементами и тегами. –

+0

В вашем случае список элементов/изображений будет сопоставлен с маркером/ключом. В моем случае, это то же самое, но я говорю это тег вместо токена. Поскольку мы, здесь, в SO, отмечаем, что наши сообщения и один тег могут содержать список сообщений. Таким образом, я считаю, что термин, который я использовал, является явно действительным. –

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