Question

Je construis une application qui a un calendrier dans lequel les utilisateurs peuvent annoter événements.

Le calendrier est privé à chaque utilisateur, qui est, l'utilisateur A ne peut pas voir les événements sur le calendrier de l'utilisateur B.

Je voudrais indexer les événements de calendrier en utilisant Zend Lucene, mais je ne suis pas sûr comment faire cela.

Je pourrais avoir l'index Lucene tous les événements ensemble, quel que soit l'utilisateur -. Mais quand une recherche est effectuée, il affichera les événements d'un utilisateur à l'autre, et ce n'est pas ce que je veux

Je ne pense pas que ce serait une bonne idée de créer une exclusivité d'index à chaque utilisateur, mais je suis d'idées comment:

  • créer un index commun des événements de calendrier de tous les utilisateurs
  • lorsqu'une recherche est effectuée, les résultats de la force pour afficher uniquement les événements qui appartiennent à l'utilisateur d'effectuer la recherche

Toutes les idées / suggestions / conseils sur la façon de le faire?

Était-ce utile?

La solution

Voici comment je résolu cette question:

Tout d'abord, assurez-vous que vous incluez champ user_id lors de la construction de l'indice

Notez qu'il est sage d'utiliser Keyword() pour user_id car nous voulons Lucene à la recherche et afficher que ces données dans les résultats.

    $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

Ensuite, ajoutez une sous-requête booléenne sur le backend (programatically) qui forcera tous les résultats pour inclure la chaîne de requête (la d'entrée de recherche de l'utilisateur) et le user_id de cet utilisateur.

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

Et là vous l'avez.

Maintenant, si les recherches 123 utilisateur pour « rendez-vous », Lucene fera la recherche en fait être quelque chose comme appointment AND user_id=123.

Permettez-moi de savoir s'il y a un moyen d'améliorer cela -. Heureux de discuter

Autres conseils

Je n'ai pas essayé, mais sans doute cela fonctionnera.

Vous pouvez l'ID d'index dans le champ user_id et recherche événement qui doit avoir dans le champ « user_id » expression recherchée, dans votre cas, le nombre:

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

Ceci recherche pour la phrase '333' dans un champ 'user_id'.

Je ne suis pas sûr que cela ne vous renvoie à tout indice Whit numéro « 333 » comme « 3334 », « 3335 », ... vous devez essayer. Si ce retour à vous tous les autres résultats (3334, 3335, ...), vous pouvez définir que vous voulez rechercher seulement « 333 » mais je laisse à votre recherche:)

Vous pouvez trouver tout ce dont vous avez besoin ici: Zend_Search


Dans tous les cas, vous pouvez stocker user_id dans l'index. Que lorsque des événements de recherche de quelqu'un que vous avez à afficher résultat seulement avoir:

user_id de l'index == user_id de la session, cela fonctionne pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top