문제

다양한 ORM에서 검색을 처리하는 방법에 대한 정보를 찾고 있습니다.

현재 저는 PHP로 일부 오래된 애플리케이션을 재개발 중이며 요구 사항 중 하나는 다음과 같습니다.모든 것 또는 거의 모든 것을 검색 가능하게 만들기 때문에 사용자가 '펑크록 라이브'라고 입력하기만 하면 앱이 그런 식으로 라벨이 붙은 비디오 클립, 음악 트랙, 리뷰, 예정된 이벤트 또는 사용자 댓글까지 찾아줍니다.

모든 것이 검색 가능한 환경에서 ORM은 두 가지 방법으로 이 기능을 지원해야 합니다.

  • ORM의 "O" 측에 일부 인덱싱 API 제공
  • "R" 측에서 대량 데이터베이스 검색을 위한 수단 제공

이상적인 솔루션은 검색된 문자열을 기반으로 기성품 개체를 반환하는 것입니다.반드시 PHP가 아니어도 해당 작업을 수행하는 좋은 엔드투엔드 솔루션을 알고 계십니까?비슷한 문제를 겪었다면 당신의 경험이 무엇인지 듣는 것이 좋을 것입니다.그 이상의 것 루씬 사용 또는 시맨틱 웹이 그 길이다 oneliners, 그래도 ;-)*

도움이 되었습니까?

해결책

나는 최근에 나침반 검색 엔진을 Java EE 5 애플리케이션으로 변환합니다.그것은 기반으로합니다 루씬 자바 다양한 ORM 프레임워크는 물론 XML과 같은 다른 유형의 모델을 지원하거나 실제 모델이 전혀 지원되지 않습니다.

ORM 프레임워크에 의해 관리되는 객체 모델의 경우 특별한 주석을 사용하여 클래스에 주석을 달 수 있습니다(예:@Searchable), 클래스를 등록하고 Compass가 애플리케이션 시작 시 해당 클래스를 색인화하고 모델의 변경 사항을 자동으로 수신하도록 하세요.

검색과 관련하여 Lucene의 강력한 기능을 사용할 수 있습니다.그런 다음 Compass는 모델 객체의 인스턴스를 검색 결과로 제공합니다.

PHP는 아니지만 반드시 PHP일 필요는 없다고 하셨습니다 ;) 이것이 도움이 될지는 모르겠지만...

다른 팁

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);
}

그러면 모든 항목의 색인이 유지됩니다.검색의 경우 몇 가지 메서드를 사용하여 검색 클래스를 만드는 것이 좋습니다.

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;
   }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top