# HG changeset patch # User dwinter # Date 1363075444 -3600 # Node ID 9c356845613a6cddc0628109cb28228c9609172a # Parent 834706423ac1042d43b2081e1dfa014a5fdb1897 improvements for the search or search fields added diff -r 834706423ac1 -r 9c356845613a zopeSolr.py --- a/zopeSolr.py Tue Feb 26 15:22:07 2013 +0100 +++ b/zopeSolr.py Tue Mar 12 09:04:04 2013 +0100 @@ -5,7 +5,6 @@ from OFS.SimpleItem import SimpleItem from Products.PageTemplates.PageTemplateFile import PageTemplateFile -import pysolr import os.path import sunburnt from Globals import package_home @@ -59,7 +58,7 @@ #@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={}): + def generateLink(self,search,facetSearch={},ranges={},args={}): ret="?search=%s"%search for facet in facetSearch.keys(): @@ -84,6 +83,13 @@ ret+="&%s_rg=%s"%(key,value) + for key,value in args.items(): + + if isinstance(value, basestring): + value=[value] + + for val in value: + ret+="&%s=%s"%(key,val) return ret #hilfsmethode erzeuget immer eine liste von einträgen @@ -145,7 +151,7 @@ #dokumentiert. Highlighting selbst wird in sorlconfig.xml konfiguriert. #return ein Queryobjet, zur eigentlichen Suche muss darauf noch execute ausgeführt werden. - def prepareSearch(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True): + def prepareSearch(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,orSearch=None): "search solr" @@ -167,9 +173,28 @@ vals=[x.decode('utf-8') for x in vals] else: vals=vals.decode('utf-8') + + facetSearch[field.replace("_fc",'')]=vals #ranges form a-b + + if field.endswith("_or"): + if orSearch is None: + orSearch={} + + vals = constr[field] + if not isinstance(vals,basestring): + + vals=[x.decode('utf-8') for x in vals] + else: + vals=vals.decode('utf-8') + + + orSearch[field.replace("_or",'')]=vals + #ranges form a-b + + if field.endswith("_rg"): @@ -230,12 +255,37 @@ del facetSearch[key] # loesche das urspuerngliche feld else: - val = [x for x in vals if x!="*"] #siehe oben + if not isinstance(vals, basestring): + val = [x for x in vals if x!="*"] #siehe oben + else: + val = [vals] facetSearch[key]=val res=res.query(**facetSearch) - + + + #felder mit ODER-Suche + if orSearch: + + for key,vals in orSearch.items(): + qr = None + if not "*" in vals: #dann ohne einschränkung (key:*) sucht nur nach eintragen in denen etwas im feld steht, wir wollen aber alle + if isinstance(vals, basestring): + vals = [vals] + + + for val in vals: + if not qr: + qr=self._v_solr.Q(**{key:val}) + + else: + qr=qr|self._v_solr.Q(**{key:val}) + + + res=res.query(qr) + + #wenn facetField existieren dann rufe facetierung auf if len(facetFields)>0: @@ -259,9 +309,9 @@ #erzeugt eine Suchabfrage und führt diese aus. #return {"result":response.result, "hl":response.highlighting,"facetFields":facetedFields} - def search(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True): + def search(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,orSearch=None): - res=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets) + res=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets,orSearch=orSearch) response= res.execute() #speichere faceted fields @@ -407,6 +457,7 @@ #return only the values of resultList whicht start with startLetter or if starLetterNonAscii all values which #start with an non ascii character def filter (self,resultList,startLetter=None,startLetterNonAscii=0): + ls=[] if startLetter: matchStr = "[\[\]'\"]*"+startLetter