Domanda

Sto costruendo un app che ha un calendario in cui gli utenti possono annotare eventi.

Il Calendario è privato per ogni utente, che è, l'utente A non può vedere gli eventi in calendario dell'utente B.

Vorrei indice gli eventi del calendario utilizzando Zend Lucene, ma sono sicuri di come fare questo.

I potrebbe avere indice di Lucene tutti gli eventi insieme, indipendentemente utente -. Ma poi quando una ricerca è fatta mostrerà gli eventi di un utente all'altro, e che non è quello che voglio

Non credo che sarebbe una buona idea per creare un esclusivo indice per ogni utente, ma sono a corto di idee come:

  • creare un indice comune di eventi di calendario da tutti gli utenti
  • quando una ricerca è fatta, i risultati di forza per mostrare solo gli eventi che appartengono utente che esegue la ricerca

Tutte le idee / suggerimenti / indicazioni su come fare questo?

È stato utile?

Soluzione

Ecco come ho risolto questo problema:

Per prima cosa, assicuratevi di includere campo user_id quando si costruisce l'indice

Si noti che è saggio uso Keyword() per user_id dal momento che vogliamo Lucene per la ricerca, così come visualizzare tali dati nei risultati.

    $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

Avanti, aggiungere un subquery booleana sul backend (programatically) che costringerà tutti i risultati per includere la stringa di query (input di ricerca dell'utente) E user_id di questo utente.

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

E il gioco è fatto.

Ora, se le ricerche utente 123 per 'appuntamento', Lucene farà la ricerca in realtà qualcosa di simile appointment AND user_id=123.

Fammi sapere se c'è un modo per migliorare questo -. Lieti di discutere

Altri suggerimenti

non ho provato questo, ma probabilmente funzionerà.

Puoi ID indice nel campo user_id e cercare evento che deve avere nel 'user_id' campo cercato frase, nel tuo caso il numero:

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

In questo modo la ricerca di '333' frase in un campo 'user_id'.

Non sono sicuro che questo non sarebbe tornato a voi tutti indice di Pentecoste '333' come numero '3334', '3335', ??... dovete provare. Se questo ritorno a voi tutti gli altri risultati (3334, 3335, ...), è possibile impostare che si desidera cercare solo '333', ma lascio alla tua ricerca:)

Potete trovare tutto quello che vi serve qui: Zend_Search


In ogni caso, è possibile memorizzare id_utente nell'indice. Rispetto a quando gli eventi di ricerca qualcuno si deve visualizzare solo risultato che avere:

user_id dall'indice == user_id dalla sessione, questo funzionerà di sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top