# HG changeset patch # User dwinter # Date 1366991544 -7200 # Node ID 10733d367831f1004920c9dfe95cf63a907dc897 # Parent 156c1db5a701842fa76cc2deaae5bc2bfdee91fe date ranges links auf fulltext diff -r 156c1db5a701 -r 10733d367831 zopeSolr.py --- a/zopeSolr.py Wed Mar 13 08:39:41 2013 +0100 +++ b/zopeSolr.py Fri Apr 26 17:52:24 2013 +0200 @@ -9,6 +9,7 @@ import sunburnt from Globals import package_home import httplib2 +import urlparse import urllib import re import xml.etree.ElementTree as ET @@ -23,6 +24,10 @@ } +PURLSERVER="http://md.mpiwg-berlin.mpg.de/purls/" + +#TODO: only needed for getTermsAsJSON, solle irgendwie aus dem sunburnt kommen +SOLRSERVER="/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true" def zptFile(self, path, orphaned=False): """returns a page template file from the product""" @@ -53,12 +58,43 @@ def connect(self): self._v_solr=sunburnt.SolrInterface(url=self.solrURL) - + + + #erzeuge den link auf die fulltext display version des bildviewers + def createFullTextLink(self,page,facetSerch,search): + + fqs=[] + for key in facetSerch.keys(): + values = self.getList(facetSerch.get(key)) + for value in values: + if value!="*": + fqs.append("%s=%s"%(key,urllib.quote(value))); + + ret="pf=%s"%page + ret+="&query=(" + + + + ret+=" OR ".join(fqs) + #if len(fqs)>0 and len(qs)>0 and qs[0]!="": + if len(fqs)>0 and len(search)>0: #TODO das muss noch geandert werden, wenn das der normale suchstring nach feldern müssen alle "AND" in "OR" getauscht werden + #da ja in der volltext-line die Zeile gedunfen werden soll wenn eines der Worte drin ist, vorher wurd eventuell und über die ganee seite gesucht + #die worte müssen aber nicht in einer zeile sein und werden jetzt nicht gefunden + ret+=" OR " + + + + ret+="("+search+")" + + ret+=")&viewLayer=search" + + return ret + #erzeuge einen Link, insbesonder für faceted suche #@param search: ist suchparameter, wird einfach als search=%s weitergereicht #@param facetSearch: bekommt einen hash (feldname, liste der suchworte) - def generateLink(self,search,facetSearch={},ranges={},args={}): + def generateLink(self,search,facetSearch={},ranges={},dateranges={},args={}): ret="?search=%s"%search for facet in facetSearch.keys(): @@ -82,6 +118,14 @@ for value in values: ret+="&%s_rg=%s"%(key,value) + for key,values in dateranges.items(): + + if isinstance(values, basestring): + values=[values] + + for value in values: + ret+="&%s_drg=%s"%(key,value) + for key,value in args.items(): @@ -104,13 +148,21 @@ #@param begin anfang der ranges #@param end ende der Raanges #@param increment größe eines ranges + #@param date wenn wahr, dann ist field ein Datumsfeld, begin, end,increment sind trotzdem zur Zeit, dan Integer für Jahre !!, d.h. zur Zeit sind nur JAhre als Schritte möglich # für alle andere paramter @see prepareSearch #@return gibt ein hash: mit range -> anzahl der Treffer in dem Ranage. e.g 1921-1950 -> 21 - def ranges(self,field,begin,end,increment,solrQuery="",facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True): + + def ranges(self,field,begin,end,increment,solrQuery="",facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,date=False,storeFields=False): q=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets) - res={} + res={} #speiceher abzahl + + fls={} #speichere felder + + #for fl in storeFields: #initialisiere den hash + # fls[fl]={} + if not getattr(self,'_v_solr_',None): self.connect() @@ -120,15 +172,36 @@ query={} #query["%s__gt"%field]=x #TODO __gt scheint nicht zu funktionieren wird zu gte (???) - query["%s__gte"%field]=int(x)+1 - - query["%s__lte"%field]=x+increment + + if not date: + query["%s__gte"%field]=int(x)+1 + + query["%s__lte"%field]=x+increment + + key="%s-%s"%(x,x+increment) - result = q.query(**query).execute() + else: + year="%s-01-01T00:00:00Z" + query["%s__gte"%field]=year%(int(x)) + + query["%s__lte"%field]=year%(x+increment) + + key="%s@%s"%(year%(int(x)),year%(x+increment)) + + result = q.query(**query).highlight("text_german").execute() - res["%s-%s"%(x,x+increment)]=result.result.numFound + res[key]=result.result.numFound + + if storeFields: + fls[key] = result.highlighting; + - return res + + if storeFields: + return res,fls + + else: + return res #prepareSearch erzeugt die Suchabfrage @@ -205,7 +278,14 @@ #TODO __gt scheint nicht zu funktionieren wird zu gte (???) ranges[field.replace("_rg","__gte")]=int(splitted[0])+1 ranges[field.replace("_rg","__lte")]=splitted[1] - + + elif field.endswith("_drg"): + splitted = "@".split(field) + if len(splitted)==2: + #ranges[field.replace("_rg","__gt")]=splitted[0] + #TODO __gt scheint nicht zu funktionieren wird zu gte (???) + ranges[field.replace("_drg","__gte")]=splitted[0] + ranges[field.replace("_drg","__lte")]=splitted[1] #teste verbindung zu solr @@ -226,15 +306,18 @@ res=res.query(splitted) + if len(ranges.keys())>0: + + res=res.query(ranges) - + #ubergebe alle weiteren feld an die suche. if facetSearch: for key,vals in facetSearch.items(): - if key.endswith("_rg"): + if key.endswith("_rg"): #range if not isinstance(vals,basestring): @@ -249,9 +332,29 @@ if len(splitted)==2: #TODO __gt scheint nicht zu funktionieren wird zu gte (???) facetSearch[key.replace("_rg","__gte")]=int(splitted[0])+1 - facetSearch[key.replace("_rg","__lte")]=splitted[1] + facetSearch[key.replace("_rg","__lte")]=int(splitted[1]) del facetSearch[key] # loesche das urspuerngliche feld + + elif key.endswith("_drg"): #daterange + + if not isinstance(vals,basestring): + + vals=[x.decode('utf-8') for x in vals] + else: + vals=[vals.decode('utf-8')] + + for val in vals: + + splitted = val.split("@") + + if len(splitted)==2: + #TODO __gt scheint nicht zu funktionieren wird zu gte (???) + facetSearch[key.replace("_drg","__gte")]=splitted[0] + facetSearch[key.replace("_drg","__lte")]=splitted[1] + + del facetSearch[key] # loesche das urspuerngliche feld + else: if not isinstance(vals, basestring): @@ -260,7 +363,7 @@ val = [vals] facetSearch[key]=val - + res=res.query(**facetSearch) @@ -298,16 +401,35 @@ res=res.paginate(start=start, rows=rows) - + #only highlighting if not searhc for only "*" - avoid max clause error if solrQuery=="*": + res=res.paginate(start=start, rows=rows) else: + res=res.paginate(start=start, rows=rows).highlight(usePhraseHighlighter=True) return res + def replaceParameter(self,paramsNeu,queryString,ignore=[]): + params=urlparse.parse_qs(queryString); + + for key in paramsNeu.keys(): + + params[key]=paramsNeu[key] + + for key in ignore: + del params[key] + + retArray = [] + for x in params.keys(): + for y in self.getList(params[x]): + retArray.append("%s=%s"%(x,urllib.quote(y))) + + print retArray + return "&".join(retArray); #für die parameter @see prepareSearch #erzeugt eine Suchabfrage und führt diese aus. #return {"result":response.result, "hl":response.highlighting,"facetFields":facetedFields} @@ -403,7 +525,8 @@ urlq=url.replace(":","\:") urlq=urlq.replace("/","\/") - q ="http://localhost:8983/solr/mpiwgweb/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"%(idfield,urlq,field) + #q ="http://localhost:8983/solr/mpiwgweb/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"%(idfield,urlq,field) + q =self.solrURL+SOLRSERVER%(idfield,urlq,field) resp, content = h.request(q) @@ -462,15 +585,18 @@ def filter (self,resultList,startLetter=None,startLetterNonAscii=0): ls=[] if startLetter: + startLetter=startLetter.lower() matchStr = "[\[\]'\"]*"+startLetter - ls = [x for x in resultList if re.match(matchStr,x[0])] + ls = [x for x in resultList if re.match(matchStr,x[0].lower())] if startLetterNonAscii ==1: ls = [x for x in resultList if not re.match("[\[\]'\"a-zA-Z].*",x[0])] return ls + + def manage_addZopeSolrForm(self): """Form for external Links""" pt=zptFile(self, 'zpt/AddZopeSolr.zpt') @@ -487,4 +613,4 @@ if RESPONSE is not None: RESPONSE.redirect('manage_main') - + \ No newline at end of file diff -r 156c1db5a701 -r 10733d367831 zpt/AddZopeSolr.zpt --- a/zpt/AddZopeSolr.zpt Wed Mar 13 08:39:41 2013 +0100 +++ b/zpt/AddZopeSolr.zpt Fri Apr 26 17:52:24 2013 +0200 @@ -5,6 +5,7 @@ ID: Title: url: +  e.g. http://127.0.0.1:8983/solr/collection1, no SLASH "/" at the end diff -r 156c1db5a701 -r 10733d367831 zpt/ChangeZopeSolr.zpt --- a/zpt/ChangeZopeSolr.zpt Wed Mar 13 08:39:41 2013 +0100 +++ b/zpt/ChangeZopeSolr.zpt Fri Apr 26 17:52:24 2013 +0200 @@ -4,6 +4,7 @@ +
Title:
url:
 e.g. http://127.0.0.1:8983/solr/collection1, no SLASH "/" at the end