Frage

Ich erstelle eine App mit einem Kalender, in dem Benutzer Ereignisse kommentieren können.

Der Kalender ist für jeden Benutzer privat, d. h. Benutzer A kann die Ereignisse im Kalender von Benutzer B nicht sehen.

Ich möchte die Kalenderereignisse mit Zend Lucene indizieren, bin mir aber nicht sicher, wie das geht.

Ich könnte Lucene alle Ereignisse zusammen indizieren lassen, unabhängig vom Benutzer – aber wenn eine Suche abgeschlossen ist, werden die Ereignisse eines Benutzers dem anderen angezeigt, und das ist nicht das, was ich möchte.

Ich glaube nicht, dass es eine gute Idee wäre, einen Index exklusiv für jeden Benutzer zu erstellen, aber ich habe keine Ahnung, wie man Folgendes tun kann:

  • Erstellen Sie einen gemeinsamen Index der Kalenderereignisse aller Benutzer
  • Wenn eine Suche abgeschlossen ist, erzwingen Sie, dass in den Ergebnissen nur Ereignisse angezeigt werden, die dem Benutzer gehören, der die Suche durchführt

Irgendwelche Ideen/Vorschläge/Hinweise, wie das geht?

War es hilfreich?

Lösung

So habe ich dieses Problem gelöst:

Stellen Sie zunächst sicher, dass Sie einschließen user_id Feld beim Erstellen des Index

Beachten Sie, dass es ratsam ist, sie zu verwenden Keyword() zum user_id Da wir möchten, dass Lucene diese Daten in Ergebnissen sucht und anzeigt.

    $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

Fügen Sie als Nächstes eine boolesche Unterabfrage in das Backend hinzu (programmatisch), das alle Ergebnisse dazu zwingt, die Abfragezeichenfolge (Benutzer -Sucheingabe) und die des Benutzers einzuschließen 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);

Und da hast du es.

Nun, wenn Benutzer 123 Suche nach "Termin" wird Lucene die Suche tatsächlich so aussehen wie appointment AND user_id=123.

Lassen Sie mich wissen, ob es eine Möglichkeit gibt, dies zu verbessern - froh zu diskutieren.

Andere Tipps

Ich habe es nicht versucht, aber wahrscheinlich wird es funktionieren.

Sie können die ID im Feld „user_id“ indizieren und nach einem Ereignis suchen, das im Feld „user_id“ eine gesuchte Phrase enthalten muss, in Ihrem Fall die Nummer:

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

Dadurch wird nach der Phrase „333“ in einem Feld „user_id“ gesucht.

Ich bin mir nicht sicher, ob dies nicht zu einem Index mit der Nummer „333“ wie „3334“, „3335“ usw. führen würde.das musst du ausprobieren.Wenn Sie dadurch alle anderen Ergebnisse erhalten (3334, 3335,...), können Sie festlegen, dass Sie nur nach „333“ suchen möchten, aber ich überlasse das Ihrer Recherche :)

Hier finden Sie alles, was Sie brauchen: Zend_Search


In jedem Fall können Sie user_id in Ihrem Index speichern.Wenn jemand nach Ereignissen sucht, müssen Sie nur Ergebnisse anzeigen, die Folgendes enthalten:

user_id from index == user_id from session, das wird sicher funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top