Zend Lucene - как построить индекс для приложения Календарь? - PullRequest
2 голосов
/ 02 декабря 2011

Я создаю приложение с календарем, в котором пользователи могут комментировать события.

Календарь является личным для каждого пользователя, то есть пользователь A не может видеть события в календаре пользователя B.

Я хотел бы проиндексировать события календаря с помощью Zend Lucene, но яне знаете, как это сделать.

Я мог бы, чтобы Lucene проиндексировал все события вместе, независимо от пользователя - но тогда, когда поиск будет выполнен, он покажет события одного пользователя другому, и это не то, что я хочу.

Не думаю, что было бы неплохо создавать индекс, эксклюзивный для каждого пользователя, но у меня нет идей, как:

  • создать общий индекс календаря.события от всех пользователей
  • после завершения поиска принудительно отображать в результатах только те события, которые принадлежат пользователю, выполняющему поиск

Есть идеи / предложения / указатели о том, как это сделать?

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Вот как я решил эту проблему:

Сначала убедитесь, что вы включили поле user_id при построении индекса

Обратите внимание, что разумно использовать Keyword() для user_id, поскольку мы хотим, чтобы Lucene выполнял поиск и отображал эти данные в результатах.

    $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 голосов
/ 02 декабря 2011

Я не пробовал это, но, вероятно, это будет работать.

Вы можете индексировать ID в поле user_id и событие поиска, которое должно иметь искомую фразу в поле 'user_id', в вашем случае число:

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

Будет выполнен поиск фразы «333» в поле «user_id».

Я не уверен, что это не вернет вам индекс «333», например «3334», «3335», ... вы должны попробовать. Если это вернет вам все остальные результаты (3334, 3335, ...), вы можете установить, что вы хотите искать только «333», но я оставляю это для вашего исследования:)

Вы можете найти все, что вам нужно здесь: Zend_Search


В любом случае Вы можете сохранить user_id в своем индексе. Когда кто-то ищет события, вы должны отображать только результат, который имеет:

user_id из индекса == user_id из сессии, это будет работать наверняка.

...