Pregunta

Estoy creando una aplicación que tiene un Calendario en el que los usuarios pueden anotar eventos.

El Calendario es privado para cada usuario, es decir, el usuario A no puede ver los eventos en el calendario del usuario B.

Me gustaría indexar los eventos del calendario usando Zend Lucene, pero no estoy seguro de cómo hacerlo.

Podría hacer que Lucene indexe todos los eventos juntos, independientemente del usuario, pero luego, cuando se realiza una búsqueda, mostrará los eventos de un usuario al otro, y eso no es lo que quiero.

No creo que sea una buena idea crear un índice exclusivo para cada usuario, pero no tengo ideas sobre cómo:

  • crear un índice común de eventos del calendario de todos los usuarios
  • cuando se realiza una búsqueda, fuerza que los resultados muestren solo los eventos que pertenecen al usuario que realiza la búsqueda

¿Alguna idea/sugerencia/consejos sobre cómo hacer esto?

¿Fue útil?

Solución

Así es como resolví este problema:

Primero, asegúrese de incluir user_id campo al construir el índice

Tenga en cuenta que es aconsejable usar Keyword() por user_id Dado que queremos que Lucene busque y muestre estos datos en los resultados.

    $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

A continuación, agregue una subconsulta booleana en el backend (programáticamente) que obligará a todos los resultados a incluir la cadena de consulta (entrada de búsqueda del usuario) y este usuario 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);

Y ahí lo tienes.

Ahora si el usuario 123 Búsqueda de 'cita', Lucene hará que la búsqueda sea realmente como algo así como appointment AND user_id=123.

Avíseme si hay alguna forma de mejorar esto, feliz de discutir.

Otros consejos

No intenté esto, pero probablemente funcionará.

Puede indexar el ID en el campo user_id y buscar el evento que debe tener en el campo 'user_id' la frase buscada, en su caso el número:

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

Esto buscará la frase '333' en un campo 'user_id'.

No estoy seguro de que esto no les devuelva todos los índices con el número '333' como '3334', '3335',...tienes que intentarlo.Si esto le devuelve todos los demás resultados (3334, 3335,...), puede configurar que desea buscar solo '333', pero lo dejo a su investigación :)

Puedes encontrar todo lo que necesitas aquí: Zend_Buscar


En cualquier caso, puedes almacenar user_id en tu índice.Cuando alguien busca eventos, debe mostrar solo los resultados que tengan:

user_id del índice == user_id de la sesión, esto funcionará con seguridad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top