Zend Lucene - come costruire un indice per l'applicazione Calendar?
-
27-10-2019 - |
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?
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.