changeset 1:9c356845613a

improvements for the search or search fields added
author dwinter
date Tue, 12 Mar 2013 09:04:04 +0100
parents 834706423ac1
children de6b7ed0c34d
files zopeSolr.py
diffstat 1 files changed, 58 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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