Zend Lucene - Как построить индекс для приложения календаря?

StackOverflow https://stackoverflow.com/questions/8351163

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Во -первых, убедитесь, что вы включите 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.

Дайте мне знать, если есть какой -нибудь способ улучшить это - рад обсудить.

Другие советы

Я не пробовал это, но, вероятно, это сработает.

Вы можете индексировать идентификатор в поле 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 из index == user_id Из сеанса это наверняка будет работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top