Стратегии поиска в ORM - PullRequest
1 голос
/ 22 августа 2008

Я ищу информацию об обработке поиска в различных ORM.

В настоящее время я перерабатываю какое-то старое приложение на PHP, и одно из требований заключается в следующем: сделать все или почти все доступными для поиска, поэтому пользователь просто набирает "punkrock live", и приложение находит видеоклипы, музыкальные треки, отзывы, предстоящие события или даже пользователя комментарии помечены таким образом.

В среде, где все доступно для поиска, ORM должна поддерживать эту функцию двумя способами:

  • предоставление некоторого API индексации на стороне "O" ORM
  • средство для массового извлечения базы данных на стороне "R"

Идеальное решение будет возвращать готовые объекты на основе искомой строки. Знаете ли вы какие-нибудь хорошие комплексные решения, которые делают работу, не обязательно на PHP? Если вы сталкивались с подобной проблемой, было бы хорошо выслушать ваш опыт. Нечто большее, чем Использование Lucene или семантической паутины - это способ oneliners, tho; -) *

Ответы [ 2 ]

2 голосов
/ 22 августа 2008

Недавно я интегрировал поисковую систему Compass в приложение Java EE 5. Он основан на Lucene Java и поддерживает различные платформы ORM, а также другие типы моделей, такие как XML или вообще без реальной модели;)

В случае объектной модели, управляемой средой ORM, вы можете аннотировать свои классы специальными аннотациями (например, @Searchable), регистрировать свои классы и позволять Compass индексировать их при запуске приложения и автоматически прослушивать изменения модели.

Когда дело доходит до поиска, у вас есть сила Lucene под рукой. Затем Compass предоставит вам экземпляры объектов вашей модели в качестве результата поиска.

Это не PHP, но вы сказали, что это не обязательно должен быть PHP;) Не знаю, помогает ли это, хотя ...

1 голос
/ 19 ноября 2008

В файле Propel 1.3 schema.xml вы можете указать, что вы хотите, чтобы все ваши модели расширяли создаваемый вами класс "BaseModel".

В этой BaseModel вы собираетесь переопределить метод save () примерно так:

public function save(PropelPDO $con = null)
{
    if($this->getIsSearchable())
    {
             // update your search index here. Lucene, Sphinx, or otherwise
    }

    return parent::save($conn);
}

Это заботится о сохранении всего проиндексированного. Что касается поиска, я бы предложил создать класс Search с несколькими методами.

class Search
{
   protected $_searchableTypes = array('music','video','blog');

   public method findAll($search_term)
   {
      $results = array();

      foreach($this->_searchableTypes as $type)
      {
         $results[] = $this->findType($type, $search_term);
      }

      return $results;
   }
}
...