Mercurial > hg > zopeSolr
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 |