2011-12-02 5 views
2

사용자가 일정에 주석을 달 수있는 캘린더가있는 앱을 제작 중입니다.Zend Lucene - 캘린더 애플리케이션 용 색인을 작성하는 방법은 무엇입니까?

일정은 각 사용자에게 비공개입니다. 즉, 사용자 A는 사용자 B의 일정에있는 이벤트를 볼 수 없습니다.

Zend Lucene을 사용하여 캘린더 일정에 대한 색인을 작성하고 싶습니다. 그러나이를 수행하는 방법은 확실하지 않습니다.

사용자와 관계없이 모든 이벤트를 함께 색인 할 수 있습니다.하지만 검색이 끝나면 한 사용자의 이벤트가 다른 사용자에게 표시되며, 원하는 것은 아닙니다.

나는 각 사용자에게 전용 인덱스를 생성하는 것이 좋습니다있을 거라고 생각하지만, 어떻게 아이디어에서 생각하지 않습니다

  • 모든 사용자의 일정 이벤트의 일반적인 인덱스를 만들
  • 검색이 완료되면 검색을 수행하는 사용자에게 속한 이벤트 만 표시되도록 강제 실행하십시오.

이 작업을 수행하는 방법에 대한 아이디어/제안/조언이 있으십니까?

답변

1

내가이 문제를 해결하는 방법은 이 데이터를 검색 결과에 표시 할 수 있습니다.

$doc = new Zend_Search_Lucene_Document(); 

    $doc->addField(Zend_Search_Lucene_Field::Keyword('user_id', $row->user_id)); 
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('date_1', $row->date_1)); 
    $doc->addField(Zend_Search_Lucene_Field::Text('title', $row->title)); 

    $index->addDocument($doc); 

    //etc 

다음으로, 쿼리 문자열 (사용자의 검색 입력) 및이 사용자의 user_id을 포함하는 모든 결과를 강제 백엔드 (프로그래밍 방식)에 부울 하위 쿼리를 추가합니다.

$index = Zend_Search_Lucene::open($this->search_index); 

    // add user's input to parser 
    $query  = Zend_Search_Lucene_Search_QueryParser::parse($query_string); 

    // add boolean query 
    $query_bool = new Zend_Search_Lucene_Search_Query_Boolean(); 

    // add user id as a term 
    // note this is saying that a specific `user_id` 
    // must be found in a specific field (user_id) 
    $user_id = get_user_id(); // or use your own 'get user id' function 
    $term  = new Zend_Search_Lucene_Index_Term($user_id, 'user_id'); 
    $subquery1 = new Zend_Search_Lucene_Search_Query_Term($term); 

    // construct boolean requiring both user id and string 
    $query_bool->addSubquery($query, true);  // required 
    $query_bool->addSubquery($subquery1, true); // required 

    $query_result = $index->find($query_bool); 

그리고 거기 당신은 그것이있다.

사용자 123이 '약속'을 검색하면 Lucene은 실제로 검색을 appointment AND user_id=123과 같이합니다.

개선 할 수있는 방법이 있으면 알려주세요. 기꺼이 논의하십시오.

0

나는 이것을 시도하지는 않았지만 아마도 효과가있을 것입니다.

할 수 있습니다 귀하의 경우, 수 문구를 검색 'user_id를'필드에 있어야합니다 USER_ID 필드와 검색 이벤트 인덱스 ID :

$query = new Zend_Search_Lucene_Search_Query_Phrase(array('333'), null, 'user_id'); 
$hits1 = $index->find($query); 

이것은 'USER_ID에서'333 '구문을 검색됩니다 ' 들.

나는 이것이 '3334', '3335'등의 모든 색인 부엉 '333'숫자를 반환하지 않을 것이라고 확신하지 않습니다. 시도해야합니다. 다른 결과 (3334, 3335, ...)가 있다면 '333'만 검색하도록 설정할 수 있지만 연구에 맡길 수 있습니다.

여기에 필요 Zend_Search


을 어떤 경우에, 당신은 당신의 인덱스에 user_id를 저장할 수 있습니다. 누군가 검색 이벤트보다 다음과 같은 결과를 표시해야하는 것보다 :

user_id from index == user_id from this session.

첫째, 우리가 루씬을 원하기 때문에 user_id에 대한 Keyword()를 사용하는 것이 현명하다는 인덱스

참고를 구축 할 때 user_id 필드를 포함해야합니다 : 여기

관련 문제