Avancerad sökning i Alfresco Share

Den nuvarande versionen av Alfresco Share saknar möjligheten att skapa ett avancerat sökformulär för egna metadata. Det är dock inte Alfresco och Lucene som saknar möjligheterna för avancerade sökning, det som saknas är en implementation av en avancerad sökning. Enligt Alfresco roadmap så dröjer det till slutet av år 2010 innan detta kommer som standard. Så då får vi lösa det själva, och här ett förslag på hur.

Att skapa själva sökformuläret är den enkla delen, svårare är att skapa en träfflista. Så vi tittar på den delen och ser om vi kanske kan återanvända en lista som redan finns i Alfresco, till exempel den som finns i Document Library. Jag föredrar den listan framför träfflistan som finns för snabbsök, då vi direkt i listan får möjligheten att använda menyer och jobba vidare med dokumentet.
Till vänster i listan finns redan nu Snabbsökningar, till exempel “Jag Redigerar/I’m Editing”. Alltså borde det finnas möjlighet att skapa egna snabbsökningar. Och visst går det, Sebastian Wenzky har skrivit ihop ett bra exempel. Nyckeln är filen filter.lib.js som finns i
tomcat/webapps/alfresco/WEB-INF/classes/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary.
I den framgår att du faktiskt kan anropa sidan för Document Library med parameter, till exempel
http://localhost:8080/share/page/site/alfresco/documentlibrary?filter=editingMe och direkt komma till en av de inbyggda sökningarna.

Så nu behöver vi bara skapar vår eget filter i switch delen i filter.lib.js så att vi får en url motsvarande documentlibrary?filter=customQuery. Men vi behöver också ett sätt att skicka med våra sökdata, och som tur är finns det redan en parameter färdig för det ändamålet, filterData, som skickas hela vägen av Share till filter.lib.js. Vår sökurl blir då /documentlibrary?filter=customQuery&filterData=/här kommer dina sökparametrar/.

Exempel på kod i att lägga till i filter.lib.js, delar av koden är återanvänd från andra delar av filter.lib.js. Du måste anpassa den här koden till att motsvara dina egna behov och metadata.

         case "customQuery":
             filterQuery = "+PATH:\"" + parsedArgs.rootNode.qnamePath + "//*\"";
             if(args.filterData.length>0)
             {
            	 var strData=decodeURI(args.filterData);
            	 logger.log(strData);
            	 var queryArray=strData.split("|");
            	 for(var i=0;i<queryArray.length;i++)
            	 {
            		var strQuery=queryArray[i];
            		var strQueryArray=strQuery.split("_");
            		logger.log(strQueryArray[0]);
            		logger.log(strQueryArray[1]);
            		switch (strQueryArray[0])
            		{
            		case "ftx":
             			var ftterm=strQueryArray[1];
            			var ftquery=" +(";

            		      var ftterms = ftterm.split(/\s/), i, j, t;

            		      for (i = 0, j = ftterms.length; i < j; i++)
            		      {
            		         t = ftterms[i];
            		         // remove quotes - TODO: add support for quoted terms later
            		         t = t.replace(/\"/g, "");
            		         if (t.length !== 0)
            		         {
            		            switch (t.toLowerCase())
            		            {
            		               case "and":
            		                  if (i < j - 1 && ftterms[i + 1].length !== 0)
            		                  {
            		                     ftquery += "AND ";
            		                  }
            		                  break;

            		               case "or":
            		                  break;

            		               case "not":
            		                  if (i < j - 1 && ftterms[i + 1].length !== 0)
            		                  {
            		                     ftquery += "NOT ";
            		                  }
            		                  break;

            		               default:
            		                  ftquery += "TEXT:\"" + t + "\"" + " ";
            		               		break;

            		            }
            		         }
            		      }
            		      filterQuery += ftquery+") ";

            			break;
            		case "docid":
            			filterQuery += " +@sys\\:node-dbid:"+strQueryArray[1];
            			break;
            		case "contractid":
            			filterQuery += " +@ltx\\:contractid:"+strQueryArray[1];
            			break;
            		case "doctype":
            			filterQuery += " +TYPE:\"{http://www.loftux.se/model}"+strQueryArray[1]+"\"";
            			break;
            		case "file":
            			//we need to search both with and without wildcards. Sometime there is a hit
            			//sometime not if we dont depending on search term. Makes results more predictable
            			filterQuery += " +(@cm\\:name:"+strQueryArray[1] + " OR @cm\\:name:*"+strQueryArray[1]+"*)" ;
            			break;
                    case "tag":
                    	filterQuery += " +PATH:\"/cm:taggable/cm:" + search.ISO9075Encode(strQueryArray[1].toLowerCase()) + "/member\"";
                        break;
                    case "sort":

                    	if(strQueryArray[1]=="editdesc")
                    	{
                    		filterParams.sort = [
                    		{
                    		column: "@{http://www.alfresco.org/model/content/1.0}modified",
                    		ascending: false
                    		}];
                    	}
                    	if(strQueryArray[1]=="editasc")
                    	{
                    		filterParams.sort = [
                    		{
                    		column: "@{http://www.alfresco.org/model/content/1.0}modified",
                    		ascending: true
                    		}];
                    	}

                    	break;
            		}
            	 }

             }
             filterParams.query = filterQuery + filterQueryDefaults;
             filterParams.query += " " + (Filters.TYPE_MAP["documents"]);

Vi kan nu alltså anropa vår sida med (exempel)
/documentlibrary?filter=customQuery&filterData=ftx_test|doctype_contract|sort_editdesc.
Det är alltså inte en generisk lösning, varje parameter motsvarar ett fält på ditt sökformulär. Sökningen ovan skulle söka på fulltext “test” och egna dokumenttypen contract samt sortera descending på senast redigerat datum.

För att det skall visas korrekt i Share Document Library, så måste vi även lägga till vår customQuery i Share. Leta reda på filen
site-webscripts/org/alfresco/components/documentlibrary/filter.get.config.xml och lägg till ett nytt filter.

<filters>
   <filter id="all" label="link.all" />
   <filter id="editingMe" label="link.editingMe" />
   <filter id="editingOthers" label="link.editingOthers" />
   <filter id="recentlyModified" label="link.recentlyModified" />
   <filter id="recentlyAdded" label="link.recentlyAdded" />
   <filter id="favouriteDocuments" label="link.favouriteDocuments" />
   <filter id="customQuery" label="link.customQuery" />
</filters>

Vårt filter skall ju anropas via en särskild söksida, så det skall inte dyka upp som en klickbar länk. Det kan vi enkelt göra genom att göra label ovan blank i filen filter.get.properties (i samma katalog som filen ovan)
link.customQuery=
Även i filen toolbar.get.properties får vi lägga till för att resultatlistan skall se bra ut.
description.customQuery=Custom Search
description.customQuery.more=
Om du har lagt på svenska eller annat språk, lägg till även i properties filerna för de språken.

Nu har du bara kvar att skapa sökformuläret. Det kan du göra i en Dashlet, eller med en egen anpassad sida. Jag kommer inte beskriva hur i detta inlägg, kommer eventullt i en uppföljning.

Notera också att Alfresco håller på med motsvarande funktionalitet för Share i version 3.3. Det kommer bli för snabbsök, där du kan skicka med parametrar för att söka specifika metadata genom att i snabbsök skriva till exempel description:important och som skapar en url /share/page/search?t=description:important. Men vad jag förstår kommer det bara vara via snabbsök och därmed bara för avancerade användare. Ett alternativ kan vara att invänta den funktionaliteten, och sedan skriva din egna avancerade söksida som anropar den nya url:en.

Svara

 

 

 

Du kan använda dessa HTML taggar

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>