Я использовал Lucene для извлечения ключевых слов из элементов, которые будут храниться в базе данных, и для хранения объектов, которые я называю «расширениями ключевых слов», которые указывают на соответствующие объекты предметной области. Это сделало объекты предметной области доступными для поиска по ключевому слову (а также позволило определить основу) и разделило проблемы ключевых слов. База данных была создана на основе большого статического набора данных (база данных о пищевых веществах Министерства сельского хозяйства США), поэтому мне не нужно было беспокоиться об изменениях во время выполнения. Таким образом, это решение ограничено в его нынешнем виде...
Первая часть решения заключалась в написании небольшого фрагмента кода, который берет некоторый текст и извлекает оба ключевые слова и соответствующие основы (используя основу Lucene «Snowball») на карту. Вы используете это для извлечения ключевых слов/основ из некоторых объектов предметной области, которые вы храните в базе данных. Я сохранил исходные ключевые слова, чтобы создать своего рода статистику по выполненным поискам.
Вторая часть заключалась в создании объектов, которые я назвал «расширениями ключевых слов», которые хранят основы в виде массива и соответствующие ключевые слова в виде другого массива и имеют указатель на соответствующие объекты предметной области, содержащие ключевые слова (я использовал массивы, потому что они легче работают с ДБ4О). Я также разделил свой класс KeywordExtension на подклассы, чтобы они соответствовали типу объектов предметной области — так, например, я хранил объект домена «Nutrient» и соответствующий объект «NutrientKeywordExtension».
Третья часть состоит в том, чтобы собрать введенный пользователем текст поиска, снова использовать стеммер для извлечения основ и поиска объектов NutrientKeywordExtension с этими основами. Затем вы можете получить объекты Nutrient, на которые указывают эти расширения, и, наконец, представить их в качестве результатов поиска.
Как я уже сказал, моя база данных была статической — она создавалась при первом запуске приложения. В динамической базе данных вам нужно будет беспокоиться о синхронизации питательных веществ и соответствующих расширений ключевых слов. Одним из решений было бы объединить расширение ключевого слова питательного вещества и питательного вещества в один класс, если вы не возражаете против того, чтобы эти вещи были внутри ваших объектов домена (мне это не нравится). В противном случае вам необходимо учитывать расширения ключевых слов каждый раз, когда вы создаете/редактируете/удаляете свои объекты домена.
Я надеюсь, что этот ограниченный пример поможет.
person
Sam Stainsby
schedule
30.04.2011