Използвах Lucene, за да извличам ключови думи от елементи, които да се съхраняват в базата данни, и да съхранявам обекти, които наричам „разширение на ключова дума“, които сочат към съответните обекти на домейна. Това направи обектите на домейна откриваеми по ключова дума (също така позволявайки произтичане) и раздели проблемите с ключовите думи. Базата данни беше изградена от голям статичен набор от данни (базата данни за хранителни вещества на USDA), така че не трябваше да се тревожа за промени по време на изпълнение. Следователно това решение е ограничено в настоящата си форма ...
Първата част от решението беше да се напише малка част от кода, който взема малко текст и извлича както ключовите думи, така и съответните стъбла (използвайки „снежната топка“ на Lucene) в карта. Използвате това, за да извлечете ключовите думи/стъблата от някои обекти на домейн, които съхранявате в базата данни. Запазих оригиналните ключови думи, за да мога да създам някаква статистика за направените търсения.
Втората част беше да конструирам обекти, които нарекох „разширения на ключови думи“, които съхраняват основите като масив и съответните ключови думи като друг масив и имат указател към съответните обекти на домейн, които имат ключовите думи (използвах масиви, защото работят по-лесно с DB4O). Също така подкласирах моя клас KeywordExtension, за да съответства на типа на обектите на конкретния домейн - така че например съхранявах обект на домейн „Nutrient“ и съответен обект „NutrientKeywordExtension“.
Третата част е да се събере въведения от потребителя текст за търсене, отново да се използва stemmer за извличане на стъблата и търсене на обектите NutrientKeywordExtension с тези стъбла. След това можете да вземете обектите Nutrient, към които сочат тези разширения, и накрая да ги представите като резултати от търсенето.
Както казах, моята база данни беше статична - тя се създава при първото стартиране на приложението. В динамична база данни ще трябва да се грижите за синхронизирането на хранителните вещества и съответните разширения на ключови думи. Едно решение би било да обедините хранителното вещество и разширението за ключова дума хранително вещество в един клас, ако нямате нищо против да имате тези неща в обектите на вашия домейн (не ми харесва това). В противен случай трябва да отчитате разширенията на ключови думи всеки път, когато създавате/редактирате/изтривате обекти на вашия домейн.
Надявам се този ограничен пример да помогне.
person
Sam Stainsby
schedule
30.04.2011