Как объединить использование db4o для хранения данных и Lucene для индексации данных для быстрого поиска? - PullRequest
4 голосов
/ 27 апреля 2011

Я новичок как в db4o, так и в Lucene.

В настоящее время я использую db4o для сохранения своих данных в приложении для Android.Мне нужна возможность выполнять быстрый поиск, а также предоставлять пользователю подсказки (например, автозаполнение подсказок).

В SO-постере упоминается использование Lucene для индексации данных и db4o для их хранения.

Кто-нибудь реализовывал этот подход?Если да, я был бы признателен, если бы они разделяли общий подход?Какие есть альтернативы?

1 Ответ

3 голосов
/ 01 мая 2011

Я использовал Lucene для извлечения ключевых слов из элементов, которые будут храниться в базе данных, и для хранения объектов, которые я называю «расширением ключевых слов», которые указывают на соответствующие объекты домена.Это сделало доменные объекты доступными для поиска по ключевому слову (также учитывающему основание) и отделило проблемы ключевых слов.База данных была построена из большого статического набора данных (база данных по пищевым питательным веществам USDA), поэтому мне не нужно было беспокоиться об изменениях во время выполнения.Таким образом, это решение ограничено в его текущей форме ...

Первая часть решения заключалась в написании небольшого фрагмента кода, который берет некоторый текст и извлекает и ключевые слова и соответствующие основы(используя "Снежок" Люсена) в карту.Вы используете это для извлечения ключевых слов / основ из некоторых доменных объектов, которые вы храните в базе данных.Я держал исходные ключевые слова так, чтобы можно было создать какую-то статистику по выполненным поискам.

Вторая часть заключалась в создании объектов, которые я назвал «расширениями ключевых слов», которые хранят основы как массив и соответствующие ключевые слова.в качестве другого массива и иметь указатель на соответствующие доменные объекты, которые имели ключевые слова (я использовал массивы, потому что они легче работают с DB4O).Я также подклассифицировал свой класс KeywordExtension, чтобы он соответствовал типу конкретного объекта домена - так, например, я хранил объект домена Nutrient и соответствующий объект NutrientKeywordExtension.

Третья часть предназначена для сбора введенных пользователем данных.ищите текст, снова используйте stemmer для извлечения основ и ищите объекты NutrientKeywordExtension с этими основами.Затем вы можете получить объекты Nutrient, на которые указывают эти расширения, и, наконец, представить их как результаты поиска.

Как я уже говорил, моя база данных была статичной - она ​​создавалась при первом запуске приложения.В динамической базе данных вам нужно будет заботиться о синхронизации питательных веществ и соответствующих расширений ключевых слов.Одним из решений было бы объединить расширение ключевых слов нутриентов и питательных веществ в один класс, если вы не возражаете против того, чтобы эти вещи были внутри ваших доменных объектов (мне это не нравится).В противном случае вам необходимо учитывать расширения ключевых слов каждый раз, когда вы создаете / редактируете / удаляете свои доменные объекты.

Надеюсь, этот ограниченный пример поможет.

...