comparison zopeSolr.py @ 4:10733d367831

date ranges links auf fulltext
author dwinter
date Fri, 26 Apr 2013 17:52:24 +0200
parents 156c1db5a701
children f695be8f4f34
comparison
equal deleted inserted replaced
3:156c1db5a701 4:10733d367831
7 from Products.PageTemplates.PageTemplateFile import PageTemplateFile 7 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8 import os.path 8 import os.path
9 import sunburnt 9 import sunburnt
10 from Globals import package_home 10 from Globals import package_home
11 import httplib2 11 import httplib2
12 import urlparse
12 import urllib 13 import urllib
13 import re 14 import re
14 import xml.etree.ElementTree as ET 15 import xml.etree.ElementTree as ET
15 import json 16 import json
16 17
21 22
22 'title':['bd','10','11','12','18','19','20','abt','ad','di','history','geschichte','science'] 23 'title':['bd','10','11','12','18','19','20','abt','ad','di','history','geschichte','science']
23 } 24 }
24 25
25 26
27 PURLSERVER="http://md.mpiwg-berlin.mpg.de/purls/"
28
29 #TODO: only needed for getTermsAsJSON, solle irgendwie aus dem sunburnt kommen
30 SOLRSERVER="/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"
26 31
27 def zptFile(self, path, orphaned=False): 32 def zptFile(self, path, orphaned=False):
28 """returns a page template file from the product""" 33 """returns a page template file from the product"""
29 if orphaned: 34 if orphaned:
30 # unusual case 35 # unusual case
51 56
52 #Verbinde mit der solt Instance 57 #Verbinde mit der solt Instance
53 58
54 def connect(self): 59 def connect(self):
55 self._v_solr=sunburnt.SolrInterface(url=self.solrURL) 60 self._v_solr=sunburnt.SolrInterface(url=self.solrURL)
56 61
62
63 #erzeuge den link auf die fulltext display version des bildviewers
64 def createFullTextLink(self,page,facetSerch,search):
65
66 fqs=[]
67 for key in facetSerch.keys():
68 values = self.getList(facetSerch.get(key))
69 for value in values:
70 if value!="*":
71 fqs.append("%s=%s"%(key,urllib.quote(value)));
72
73 ret="pf=%s"%page
74 ret+="&query=("
75
76
77
78 ret+=" OR ".join(fqs)
79 #if len(fqs)>0 and len(qs)>0 and qs[0]!="":
80 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
81 #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
82 #die worte müssen aber nicht in einer zeile sein und werden jetzt nicht gefunden
83 ret+=" OR "
84
85
86
87 ret+="("+search+")"
88
89 ret+=")&viewLayer=search"
90
91 return ret
92
57 #erzeuge einen Link, insbesonder für faceted suche 93 #erzeuge einen Link, insbesonder für faceted suche
58 #@param search: ist suchparameter, wird einfach als search=%s weitergereicht 94 #@param search: ist suchparameter, wird einfach als search=%s weitergereicht
59 #@param facetSearch: bekommt einen hash (feldname, liste der suchworte) 95 #@param facetSearch: bekommt einen hash (feldname, liste der suchworte)
60 96
61 def generateLink(self,search,facetSearch={},ranges={},args={}): 97 def generateLink(self,search,facetSearch={},ranges={},dateranges={},args={}):
62 ret="?search=%s"%search 98 ret="?search=%s"%search
63 99
64 for facet in facetSearch.keys(): 100 for facet in facetSearch.keys():
65 101
66 searchTerms = facetSearch[facet] 102 searchTerms = facetSearch[facet]
79 if isinstance(values, basestring): 115 if isinstance(values, basestring):
80 values=[values] 116 values=[values]
81 117
82 for value in values: 118 for value in values:
83 ret+="&%s_rg=%s"%(key,value) 119 ret+="&%s_rg=%s"%(key,value)
120
121 for key,values in dateranges.items():
122
123 if isinstance(values, basestring):
124 values=[values]
125
126 for value in values:
127 ret+="&%s_drg=%s"%(key,value)
84 128
85 129
86 for key,value in args.items(): 130 for key,value in args.items():
87 131
88 if isinstance(value, basestring): 132 if isinstance(value, basestring):
102 #erzeugt analog zu den Ranges in Velocity für ein numerisches Feld die Suche in ranges 146 #erzeugt analog zu den Ranges in Velocity für ein numerisches Feld die Suche in ranges
103 #@param field:ist der name des Feldes in dem in Ranges gesucht werden soll 147 #@param field:ist der name des Feldes in dem in Ranges gesucht werden soll
104 #@param begin anfang der ranges 148 #@param begin anfang der ranges
105 #@param end ende der Raanges 149 #@param end ende der Raanges
106 #@param increment größe eines ranges 150 #@param increment größe eines ranges
151 #@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
107 # für alle andere paramter @see prepareSearch 152 # für alle andere paramter @see prepareSearch
108 #@return gibt ein hash: mit range -> anzahl der Treffer in dem Ranage. e.g 1921-1950 -> 21 153 #@return gibt ein hash: mit range -> anzahl der Treffer in dem Ranage. e.g 1921-1950 -> 21
109 def ranges(self,field,begin,end,increment,solrQuery="",facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True): 154
155 def ranges(self,field,begin,end,increment,solrQuery="",facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,date=False,storeFields=False):
110 156
111 q=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets) 157 q=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets)
112 158
113 res={} 159 res={} #speiceher abzahl
160
161 fls={} #speichere felder
162
163 #for fl in storeFields: #initialisiere den hash
164 # fls[fl]={}
165
114 if not getattr(self,'_v_solr_',None): 166 if not getattr(self,'_v_solr_',None):
115 self.connect() 167 self.connect()
116 168
117 169
118 170
119 for x in range(begin,end,increment): 171 for x in range(begin,end,increment):
120 query={} 172 query={}
121 #query["%s__gt"%field]=x 173 #query["%s__gt"%field]=x
122 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) 174 #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
123 query["%s__gte"%field]=int(x)+1 175
124 176 if not date:
125 query["%s__lte"%field]=x+increment 177 query["%s__gte"%field]=int(x)+1
126 178
127 result = q.query(**query).execute() 179 query["%s__lte"%field]=x+increment
128 180
129 res["%s-%s"%(x,x+increment)]=result.result.numFound 181 key="%s-%s"%(x,x+increment)
130 182
131 return res 183 else:
184 year="%s-01-01T00:00:00Z"
185 query["%s__gte"%field]=year%(int(x))
186
187 query["%s__lte"%field]=year%(x+increment)
188
189 key="%s@%s"%(year%(int(x)),year%(x+increment))
190
191 result = q.query(**query).highlight("text_german").execute()
192
193 res[key]=result.result.numFound
194
195 if storeFields:
196 fls[key] = result.highlighting;
197
198
199
200 if storeFields:
201 return res,fls
202
203 else:
204 return res
132 205
133 206
134 #prepareSearch erzeugt die Suchabfrage 207 #prepareSearch erzeugt die Suchabfrage
135 208
136 #solrQuery sucht im in schema.xml bzw. solrconfig.xml festgelegt generischen Feld, hierbei werden mit blanks getrennte eintrage in "AND" zerlegt. 209 #solrQuery sucht im in schema.xml bzw. solrconfig.xml festgelegt generischen Feld, hierbei werden mit blanks getrennte eintrage in "AND" zerlegt.
203 if len(splitted)==2: 276 if len(splitted)==2:
204 #ranges[field.replace("_rg","__gt")]=splitted[0] 277 #ranges[field.replace("_rg","__gt")]=splitted[0]
205 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) 278 #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
206 ranges[field.replace("_rg","__gte")]=int(splitted[0])+1 279 ranges[field.replace("_rg","__gte")]=int(splitted[0])+1
207 ranges[field.replace("_rg","__lte")]=splitted[1] 280 ranges[field.replace("_rg","__lte")]=splitted[1]
208 281
282 elif field.endswith("_drg"):
283 splitted = "@".split(field)
284 if len(splitted)==2:
285 #ranges[field.replace("_rg","__gt")]=splitted[0]
286 #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
287 ranges[field.replace("_drg","__gte")]=splitted[0]
288 ranges[field.replace("_drg","__lte")]=splitted[1]
209 289
210 290
211 #teste verbindung zu solr 291 #teste verbindung zu solr
212 if not getattr(self,'_v_solr_',None): 292 if not getattr(self,'_v_solr_',None):
213 self.connect() 293 self.connect()
224 304
225 305
226 306
227 307
228 res=res.query(splitted) 308 res=res.query(splitted)
309
229 if len(ranges.keys())>0: 310 if len(ranges.keys())>0:
311
312
230 res=res.query(ranges) 313 res=res.query(ranges)
231 314
232 315
233 #ubergebe alle weiteren feld an die suche. 316 #ubergebe alle weiteren feld an die suche.
234 if facetSearch: 317 if facetSearch:
235 for key,vals in facetSearch.items(): 318 for key,vals in facetSearch.items():
236 319
237 if key.endswith("_rg"): 320 if key.endswith("_rg"): #range
238 321
239 if not isinstance(vals,basestring): 322 if not isinstance(vals,basestring):
240 323
241 vals=[x.decode('utf-8') for x in vals] 324 vals=[x.decode('utf-8') for x in vals]
242 else: 325 else:
247 splitted = val.split("-") 330 splitted = val.split("-")
248 331
249 if len(splitted)==2: 332 if len(splitted)==2:
250 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) 333 #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
251 facetSearch[key.replace("_rg","__gte")]=int(splitted[0])+1 334 facetSearch[key.replace("_rg","__gte")]=int(splitted[0])+1
252 facetSearch[key.replace("_rg","__lte")]=splitted[1] 335 facetSearch[key.replace("_rg","__lte")]=int(splitted[1])
253 336
254 del facetSearch[key] # loesche das urspuerngliche feld 337 del facetSearch[key] # loesche das urspuerngliche feld
338
339 elif key.endswith("_drg"): #daterange
340
341 if not isinstance(vals,basestring):
342
343 vals=[x.decode('utf-8') for x in vals]
344 else:
345 vals=[vals.decode('utf-8')]
346
347 for val in vals:
348
349 splitted = val.split("@")
350
351 if len(splitted)==2:
352 #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
353 facetSearch[key.replace("_drg","__gte")]=splitted[0]
354 facetSearch[key.replace("_drg","__lte")]=splitted[1]
355
356 del facetSearch[key] # loesche das urspuerngliche feld
357
255 358
256 else: 359 else:
257 if not isinstance(vals, basestring): 360 if not isinstance(vals, basestring):
258 val = [x for x in vals if x!="*"] #siehe oben 361 val = [x for x in vals if x!="*"] #siehe oben
259 else: 362 else:
260 val = [vals] 363 val = [vals]
261 facetSearch[key]=val 364 facetSearch[key]=val
262 365
263 366
264 res=res.query(**facetSearch) 367 res=res.query(**facetSearch)
265 368
266 369
267 #felder mit ODER-Suche 370 #felder mit ODER-Suche
268 if orSearch: 371 if orSearch:
296 #res=res.paginate(start=start, rows=rows).highlight("main_content") 399 #res=res.paginate(start=start, rows=rows).highlight("main_content")
297 400
298 res=res.paginate(start=start, rows=rows) 401 res=res.paginate(start=start, rows=rows)
299 402
300 403
301 404 #only highlighting if not searhc for only "*" - avoid max clause error
302 if solrQuery=="*": 405 if solrQuery=="*":
303 406
407
304 res=res.paginate(start=start, rows=rows) 408 res=res.paginate(start=start, rows=rows)
305 else: 409 else:
410
306 res=res.paginate(start=start, rows=rows).highlight(usePhraseHighlighter=True) 411 res=res.paginate(start=start, rows=rows).highlight(usePhraseHighlighter=True)
307 412
308 return res 413 return res
309 414
310 415
416 def replaceParameter(self,paramsNeu,queryString,ignore=[]):
417 params=urlparse.parse_qs(queryString);
418
419 for key in paramsNeu.keys():
420
421 params[key]=paramsNeu[key]
422
423 for key in ignore:
424 del params[key]
425
426 retArray = []
427 for x in params.keys():
428 for y in self.getList(params[x]):
429 retArray.append("%s=%s"%(x,urllib.quote(y)))
430
431 print retArray
432 return "&".join(retArray);
311 #für die parameter @see prepareSearch 433 #für die parameter @see prepareSearch
312 #erzeugt eine Suchabfrage und führt diese aus. 434 #erzeugt eine Suchabfrage und führt diese aus.
313 #return {"result":response.result, "hl":response.highlighting,"facetFields":facetedFields} 435 #return {"result":response.result, "hl":response.highlighting,"facetFields":facetedFields}
314 436
315 def search(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,orSearch=None): 437 def search(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,orSearch=None):
401 url=url[0:-1] 523 url=url[0:-1]
402 524
403 urlq=url.replace(":","\:") 525 urlq=url.replace(":","\:")
404 urlq=urlq.replace("/","\/") 526 urlq=urlq.replace("/","\/")
405 527
406 q ="http://localhost:8983/solr/mpiwgweb/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"%(idfield,urlq,field) 528 #q ="http://localhost:8983/solr/mpiwgweb/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"%(idfield,urlq,field)
529 q =self.solrURL+SOLRSERVER%(idfield,urlq,field)
407 530
408 resp, content = h.request(q) 531 resp, content = h.request(q)
409 532
410 root = ET.fromstring(content) 533 root = ET.fromstring(content)
411 #uri = "http://127.0.0.1:18080/www_neu/de/aktuelles/features/feature28" 534 #uri = "http://127.0.0.1:18080/www_neu/de/aktuelles/features/feature28"
460 #return only the values of resultList whicht start with startLetter or if starLetterNonAscii all values which 583 #return only the values of resultList whicht start with startLetter or if starLetterNonAscii all values which
461 #start with an non ascii character 584 #start with an non ascii character
462 def filter (self,resultList,startLetter=None,startLetterNonAscii=0): 585 def filter (self,resultList,startLetter=None,startLetterNonAscii=0):
463 ls=[] 586 ls=[]
464 if startLetter: 587 if startLetter:
588 startLetter=startLetter.lower()
465 589
466 matchStr = "[\[\]'\"]*"+startLetter 590 matchStr = "[\[\]'\"]*"+startLetter
467 ls = [x for x in resultList if re.match(matchStr,x[0])] 591 ls = [x for x in resultList if re.match(matchStr,x[0].lower())]
468 592
469 if startLetterNonAscii ==1: 593 if startLetterNonAscii ==1:
470 594
471 ls = [x for x in resultList if not re.match("[\[\]'\"a-zA-Z].*",x[0])] 595 ls = [x for x in resultList if not re.match("[\[\]'\"a-zA-Z].*",x[0])]
472 return ls 596 return ls
473 597
598
599
474 def manage_addZopeSolrForm(self): 600 def manage_addZopeSolrForm(self):
475 """Form for external Links""" 601 """Form for external Links"""
476 pt=zptFile(self, 'zpt/AddZopeSolr.zpt') 602 pt=zptFile(self, 'zpt/AddZopeSolr.zpt')
477 return pt() 603 return pt()
478 604