AnsweredAssumed Answered

[Résolu]rechercher avec lucene et java dans un seul document

Question asked by adnuser on Sep 11, 2008
Latest reply on Oct 4, 2008 by adnuser
bonjour a tous,
voila je suis en train de faire une classe qui recherche dans un nœud un ou des mots et retourne true ou false.
le paramètre d'entrée "tags" est composé de mots  séparé par des virgule sous la forme "toto,+tata" sachant que le '+' donne un caractère obligatoire a ce mot.

les test avec simplement la valeur "ID" du nœud me trouve bien le nœud concerné.

           String queryOut="+ID:\""+ nodeRef.toString()+"\" ";

le test avec la série de mots me trouve bien les nœud qui contienne ces mots suivant leurs contraintes.

   query = query + " TEXT:\"+"+chktg.trim()+"\" ";
inconvénient je recherche sur tous les nœuds du repository.

Mais quand je combine les deux avec "AND" ceci me donne toujours faux.
car il ne trouve plus le nœud défini par l'"ID"


   public static boolean searchInNodeRef(NodeRef nodeRef, String tags, NodeService nodeService, SearchService searchService ) {

      boolean returned=false;
      ContentData contentData = (ContentData) nodeService.getProperty(nodeRef,ContentModel.PROP_CONTENT);
      Locale locale = contentData.getLocale();
      SearchParameters searchParameters= new SearchParameters();
      searchParameters.setLanguage(SearchService.LANGUAGE_LUCENE);
      searchParameters.addStore(nodeRef.getStoreRef());
      if (locale != null ) {
         searchParameters.addLocale(locale);
      }

           String queryOut="+ID:\""+ nodeRef.toString()+"\" ";

      String query="";
      
      if (tags == null || tags.length() <= 0) {
         return returned;
      }
      String tagsAnd = "";
      String tagsOr = "";
        
      StringTokenizer tokenizer = new StringTokenizer(tags, ",");
      while (tokenizer.hasMoreTokens()) {
            String chktg=tokenizer.nextToken();
            if ( chktg.substring(0, 1).compareTo("+") == 0 )  {
               tagsAnd = tagsAnd + chktg.substring(1, chktg.length()) + " ";
            } else {
               tagsOr = tagsOr + chktg + " ";              
            }
      }
        
      if ( tagsAnd.length() > 0 ) {
            tokenizer = new StringTokenizer(tagsAnd, " ");
            while (tokenizer.hasMoreTokens()) {
               String chktg=tokenizer.nextToken();
               query = query + " TEXT:\"+"+chktg.trim()+"\" ";
            }
      }

      if ( tagsOr.length() > 0 ) {
         query = query + " +( ";
         tokenizer = new StringTokenizer(tagsOr, " ");
        
         while (tokenizer.hasMoreTokens()) {
            String chktg=tokenizer.nextToken();
            query = query + " TEXT:\""+chktg.trim()+"\" ";
         }
         query = query + " )";
      }

      queryOut= queryOut + " " + query.trim();
      searchParameters.setQuery( queryOut.trim() );           
      // Transform the results into a node list
      ResultSet results = null;
      try {
         results = searchService.query(searchParameters);
         for (ResultSetRow row : results) {
            if (nodeRef.getId().compareTo(row.getNodeRef().getId()) == 0) {
               returned = true;  
            }
         }
      }
      finally {
         if (results != null) {
            results.close();
         }
      }
      return returned;
   }

merci d'avance pour vos Idées

Vincent

Outcomes