Mercurial > hg > zopeSolr
annotate zopeSolr.py @ 12:2e2da6d5e30d default tip
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
author | dwinter |
---|---|
date | Thu, 22 Aug 2013 14:21:25 +0200 |
parents | f7fe88804cb8 |
children |
rev | line source |
---|---|
0 | 1 # -*- coding: utf-8 -*- |
2 | |
3 #Verbindet Zope mit solr. Vorraussetzung ist das Paket sunburnt, @see http://opensource.timetric.com/sunburnt/ | |
4 | |
5 | |
6 from OFS.SimpleItem import SimpleItem | |
7 from Products.PageTemplates.PageTemplateFile import PageTemplateFile | |
8 import os.path | |
9 import sunburnt | |
10 from Globals import package_home | |
11 import httplib2 | |
4 | 12 import urlparse |
0 | 13 import urllib |
14 import re | |
15 import xml.etree.ElementTree as ET | |
16 import json | |
6 | 17 import random |
9 | 18 import logging |
0 | 19 |
20 #Worte die nicht in der Termliste angezeigt werden sollen #TODO: make this configurable | |
21 | |
22 STOPLIST={'main_content':['forward','drucken','history','science','part','publications','projects', | |
23 'project','new','geschichte','institute','related','boltzmannstraße','14195'], | |
24 | |
25 'title':['bd','10','11','12','18','19','20','abt','ad','di','history','geschichte','science'] | |
26 } | |
27 | |
28 | |
4 | 29 PURLSERVER="http://md.mpiwg-berlin.mpg.de/purls/" |
30 | |
31 #TODO: only needed for getTermsAsJSON, solle irgendwie aus dem sunburnt kommen | |
32 SOLRSERVER="/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true" | |
0 | 33 |
34 def zptFile(self, path, orphaned=False): | |
35 """returns a page template file from the product""" | |
36 if orphaned: | |
37 # unusual case | |
38 pt=PageTemplateFile(os.path.join(package_home(globals()), path)) | |
39 else: | |
40 | |
41 pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self) | |
42 return pt | |
43 | |
44 | |
45 | |
46 class ZopeSolr(SimpleItem): | |
6 | 47 |
0 | 48 |
49 meta_type="ZopeSolr" | |
50 | |
51 manage_options= ({'label':'Main Config','action': 'changeMain'},) + SimpleItem.manage_options | |
52 | |
53 def __init__(self,id,title,solrURL): | |
54 self.id=id | |
55 self.title=title | |
56 self.solrURL=solrURL #URL einer solr instance bzw. einer collection, falls nicht die default collection benutzt werden soll | |
57 | |
58 | |
59 #Verbinde mit der solt Instance | |
60 | |
61 def connect(self): | |
62 self._v_solr=sunburnt.SolrInterface(url=self.solrURL) | |
4 | 63 |
64 | |
6 | 65 def getRandom(self,number=3,field="title_s"): |
66 | |
67 """hole zufaellige eintraege""" | |
68 | |
69 | |
70 if not getattr(self,'_v_solr_',None): | |
9 | 71 try: |
72 self.connect() | |
73 except Exception, e: | |
74 logging.error("Error connecting to Solr: %s"%e) | |
75 return [] | |
6 | 76 |
77 #http://localhost:8983/solr/mpiwgSources/select/?q=*:*&sort=random_12xs34%20desc&rows=1&facet=false | |
78 | |
79 | |
80 random.seed() | |
81 rand = random.randrange(300000) | |
82 | |
83 results = self._v_solr.query("*.*").sort_by("-random_%s"%rand).paginate(start=0, rows=number).execute() | |
84 | |
85 return results | |
86 | |
4 | 87 #erzeuge den link auf die fulltext display version des bildviewers |
88 def createFullTextLink(self,page,facetSerch,search): | |
89 | |
90 fqs=[] | |
91 for key in facetSerch.keys(): | |
92 values = self.getList(facetSerch.get(key)) | |
93 for value in values: | |
94 if value!="*": | |
95 fqs.append("%s=%s"%(key,urllib.quote(value))); | |
96 | |
97 ret="pf=%s"%page | |
98 ret+="&query=(" | |
99 | |
100 | |
101 | |
102 ret+=" OR ".join(fqs) | |
103 #if len(fqs)>0 and len(qs)>0 and qs[0]!="": | |
104 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 | |
105 #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 | |
106 #die worte müssen aber nicht in einer zeile sein und werden jetzt nicht gefunden | |
107 ret+=" OR " | |
108 | |
109 | |
110 | |
111 ret+="("+search+")" | |
112 | |
113 ret+=")&viewLayer=search" | |
114 | |
115 return ret | |
116 | |
0 | 117 #erzeuge einen Link, insbesonder für faceted suche |
118 #@param search: ist suchparameter, wird einfach als search=%s weitergereicht | |
119 #@param facetSearch: bekommt einen hash (feldname, liste der suchworte) | |
120 | |
4 | 121 def generateLink(self,search,facetSearch={},ranges={},dateranges={},args={}): |
0 | 122 ret="?search=%s"%search |
123 | |
124 for facet in facetSearch.keys(): | |
125 | |
126 searchTerms = facetSearch[facet] | |
127 | |
128 if isinstance(searchTerms, basestring): | |
129 searchTerms=[searchTerms] | |
130 | |
131 for searchTerm in searchTerms: | |
12
2e2da6d5e30d
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
dwinter
parents:
11
diff
changeset
|
132 if searchTerm!="*": |
2e2da6d5e30d
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
dwinter
parents:
11
diff
changeset
|
133 try: |
2e2da6d5e30d
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
dwinter
parents:
11
diff
changeset
|
134 ret+="&%s_fc=%s"%(facet,searchTerm.encode('utf-8')) |
2e2da6d5e30d
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
dwinter
parents:
11
diff
changeset
|
135 except: |
2e2da6d5e30d
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
dwinter
parents:
11
diff
changeset
|
136 ret+="&%s_fc=%s"%(facet,searchTerm) |
2e2da6d5e30d
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
dwinter
parents:
11
diff
changeset
|
137 |
0 | 138 for key,values in ranges.items(): |
139 | |
140 if isinstance(values, basestring): | |
141 values=[values] | |
142 | |
143 for value in values: | |
144 ret+="&%s_rg=%s"%(key,value) | |
145 | |
4 | 146 for key,values in dateranges.items(): |
147 | |
148 if isinstance(values, basestring): | |
149 values=[values] | |
150 | |
151 for value in values: | |
152 ret+="&%s_drg=%s"%(key,value) | |
153 | |
0 | 154 |
1 | 155 for key,value in args.items(): |
156 | |
157 if isinstance(value, basestring): | |
158 value=[value] | |
159 | |
160 for val in value: | |
12
2e2da6d5e30d
bug in generateLink if searchterm ="*" dann wird _fc nicht in den Link eingebaut.
dwinter
parents:
11
diff
changeset
|
161 |
1 | 162 ret+="&%s=%s"%(key,val) |
0 | 163 return ret |
164 | |
165 #hilfsmethode erzeuget immer eine liste von einträgen | |
166 def getList(self,param): | |
167 if isinstance(param, basestring): | |
168 param=[param] | |
169 | |
170 return param | |
171 | |
172 #erzeugt analog zu den Ranges in Velocity für ein numerisches Feld die Suche in ranges | |
173 #@param field:ist der name des Feldes in dem in Ranges gesucht werden soll | |
174 #@param begin anfang der ranges | |
175 #@param end ende der Raanges | |
176 #@param increment größe eines ranges | |
4 | 177 #@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 |
0 | 178 # für alle andere paramter @see prepareSearch |
179 #@return gibt ein hash: mit range -> anzahl der Treffer in dem Ranage. e.g 1921-1950 -> 21 | |
4 | 180 |
181 def ranges(self,field,begin,end,increment,solrQuery="",facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,date=False,storeFields=False): | |
0 | 182 |
183 q=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets) | |
184 | |
4 | 185 res={} #speiceher abzahl |
186 | |
187 fls={} #speichere felder | |
188 | |
189 #for fl in storeFields: #initialisiere den hash | |
190 # fls[fl]={} | |
191 | |
0 | 192 if not getattr(self,'_v_solr_',None): |
9 | 193 try: |
194 self.connect() | |
195 except Exception, e: | |
196 logging.error("Error connecting to Solr: %s"%e) | |
197 return res | |
0 | 198 |
199 for x in range(begin,end,increment): | |
200 query={} | |
201 #query["%s__gt"%field]=x | |
202 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) | |
4 | 203 |
204 if not date: | |
205 query["%s__gte"%field]=int(x)+1 | |
206 | |
207 query["%s__lte"%field]=x+increment | |
208 | |
209 key="%s-%s"%(x,x+increment) | |
0 | 210 |
4 | 211 else: |
212 year="%s-01-01T00:00:00Z" | |
213 query["%s__gte"%field]=year%(int(x)) | |
214 | |
215 query["%s__lte"%field]=year%(x+increment) | |
216 | |
217 key="%s@%s"%(year%(int(x)),year%(x+increment)) | |
218 | |
219 result = q.query(**query).highlight("text_german").execute() | |
0 | 220 |
4 | 221 res[key]=result.result.numFound |
222 | |
223 if storeFields: | |
224 fls[key] = result.highlighting; | |
225 | |
0 | 226 |
4 | 227 |
228 if storeFields: | |
229 return res,fls | |
230 | |
231 else: | |
232 return res | |
0 | 233 |
234 | |
235 #prepareSearch erzeugt die Suchabfrage | |
236 | |
237 #solrQuery sucht im in schema.xml bzw. solrconfig.xml festgelegt generischen Feld, hierbei werden mit blanks getrennte eintrage in "AND" zerlegt. | |
238 #TODO: erlaube auch suche nach phrasen mit "" | |
239 #facetFields:Liste der Felder, nach denen facitiert werden sollen, wirdn in facet_by in solrburn uebersetzt. | |
240 #start: Erste Eintrag für paginierung, anzahl der Treffer | |
241 #rows: anzahl der Treffer | |
242 #facetSearch: Hash mit Feldnamen: suchwort oder Feldname: liste von Suchworten, hast wird direkt an query von solrburnt weitergegeben, | |
243 #sortfacets: if true, dann werden die Ergebnisse der facetierten suche alphabetisch sortiert, ACHTUNG: das ist nicht gleich der Funktion in solr die Liste | |
244 #direkt sortiert zurückzubekommen, hier werden die haufigsten Werte genommen (einstellt in solrconfig.xml) und dann nur diese sortiert! | |
245 #ausserdem werden beim sortieren, die stopworte gefiltert! | |
246 # | |
247 #neben den direkten parameter koennen auch parameter fuer die facetierte Suche über FORM im REQUEST übergeben werden, diese Felder müssen dann | |
248 #mit "_fc" enden. | |
249 # gibt als ergebnis den folgenden Hash, so wie in http://opensource.timetric.com/sunburnt/queryingsolr.html#executing-queries-and-interpreting-the-response, | |
250 # http://opensource.timetric.com/sunburnt/queryingsolr.html#highlighting | |
251 # und http://opensource.timetric.com/sunburnt/queryingsolr.html#faceting | |
252 #dokumentiert. Highlighting selbst wird in sorlconfig.xml konfiguriert. | |
253 #return ein Queryobjet, zur eigentlichen Suche muss darauf noch execute ausgeführt werden. | |
254 | |
10 | 255 def prepareSearch(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,orSearch=None,sorting=None): |
0 | 256 "search solr" |
257 | |
258 | |
259 ranges={} | |
260 ## deal with a form | |
261 if self.REQUEST: | |
262 constr = self.REQUEST.form | |
3 | 263 |
0 | 264 for field in constr.keys(): |
265 | |
266 #facetes | |
267 if field.endswith("_fc"): | |
268 if facetSearch is None: | |
269 facetSearch={} | |
270 | |
271 vals = constr[field] | |
272 if not isinstance(vals,basestring): | |
273 | |
274 vals=[x.decode('utf-8') for x in vals] | |
275 else: | |
276 vals=vals.decode('utf-8') | |
1 | 277 |
278 | |
0 | 279 facetSearch[field.replace("_fc",'')]=vals |
280 #ranges form a-b | |
281 | |
1 | 282 |
283 if field.endswith("_or"): | |
284 if orSearch is None: | |
285 orSearch={} | |
286 | |
287 vals = constr[field] | |
288 if not isinstance(vals,basestring): | |
289 | |
290 vals=[x.decode('utf-8') for x in vals] | |
291 else: | |
292 vals=vals.decode('utf-8') | |
293 | |
294 | |
295 orSearch[field.replace("_or",'')]=vals | |
296 #ranges form a-b | |
297 | |
298 | |
0 | 299 |
300 if field.endswith("_rg"): | |
301 | |
302 | |
303 splitted = "_".split(field) | |
304 if len(splitted)==2: | |
305 #ranges[field.replace("_rg","__gt")]=splitted[0] | |
306 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) | |
307 ranges[field.replace("_rg","__gte")]=int(splitted[0])+1 | |
308 ranges[field.replace("_rg","__lte")]=splitted[1] | |
4 | 309 |
310 elif field.endswith("_drg"): | |
311 splitted = "@".split(field) | |
312 if len(splitted)==2: | |
313 #ranges[field.replace("_rg","__gt")]=splitted[0] | |
314 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) | |
315 ranges[field.replace("_drg","__gte")]=splitted[0] | |
316 ranges[field.replace("_drg","__lte")]=splitted[1] | |
0 | 317 |
318 | |
319 #teste verbindung zu solr | |
320 if not getattr(self,'_v_solr_',None): | |
9 | 321 try: |
322 self.connect() | |
323 except Exception, e: | |
324 logging.error("Error connecting to Solr: %s"%e) | |
325 return [] | |
0 | 326 |
327 solrQuery = solrQuery.decode('utf-8') | |
328 | |
329 #teile die suche nach " " daraus wird dann eine AND suche | |
330 #TODO: sollte flexibler sein. insbesondere phrasen | |
331 splitted= solrQuery.split(" ") | |
332 | |
333 res = self._v_solr | |
334 | |
335 | |
336 | |
337 | |
338 res=res.query(splitted) | |
4 | 339 |
0 | 340 if len(ranges.keys())>0: |
4 | 341 |
342 | |
0 | 343 res=res.query(ranges) |
344 | |
4 | 345 |
0 | 346 #ubergebe alle weiteren feld an die suche. |
347 if facetSearch: | |
348 for key,vals in facetSearch.items(): | |
349 | |
4 | 350 if key.endswith("_rg"): #range |
0 | 351 |
352 if not isinstance(vals,basestring): | |
353 | |
354 vals=[x.decode('utf-8') for x in vals] | |
355 else: | |
356 vals=[vals.decode('utf-8')] | |
357 | |
358 for val in vals: | |
359 | |
360 splitted = val.split("-") | |
3 | 361 |
0 | 362 if len(splitted)==2: |
363 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) | |
364 facetSearch[key.replace("_rg","__gte")]=int(splitted[0])+1 | |
4 | 365 facetSearch[key.replace("_rg","__lte")]=int(splitted[1]) |
3 | 366 |
0 | 367 del facetSearch[key] # loesche das urspuerngliche feld |
4 | 368 |
369 elif key.endswith("_drg"): #daterange | |
370 | |
371 if not isinstance(vals,basestring): | |
372 | |
373 vals=[x.decode('utf-8') for x in vals] | |
374 else: | |
375 vals=[vals.decode('utf-8')] | |
376 | |
377 for val in vals: | |
378 | |
379 splitted = val.split("@") | |
380 | |
381 if len(splitted)==2: | |
382 #TODO __gt scheint nicht zu funktionieren wird zu gte (???) | |
383 facetSearch[key.replace("_drg","__gte")]=splitted[0] | |
384 facetSearch[key.replace("_drg","__lte")]=splitted[1] | |
385 | |
386 del facetSearch[key] # loesche das urspuerngliche feld | |
387 | |
0 | 388 |
389 else: | |
1 | 390 if not isinstance(vals, basestring): |
391 val = [x for x in vals if x!="*"] #siehe oben | |
392 else: | |
393 val = [vals] | |
0 | 394 facetSearch[key]=val |
395 | |
4 | 396 |
0 | 397 res=res.query(**facetSearch) |
1 | 398 |
399 | |
400 #felder mit ODER-Suche | |
401 if orSearch: | |
402 | |
403 for key,vals in orSearch.items(): | |
404 qr = None | |
405 if not "*" in vals: #dann ohne einschränkung (key:*) sucht nur nach eintragen in denen etwas im feld steht, wir wollen aber alle | |
406 if isinstance(vals, basestring): | |
407 vals = [vals] | |
408 | |
409 | |
410 for val in vals: | |
411 if not qr: | |
412 qr=self._v_solr.Q(**{key:val}) | |
413 | |
414 else: | |
415 qr=qr|self._v_solr.Q(**{key:val}) | |
416 | |
417 | |
418 res=res.query(qr) | |
419 | |
420 | |
0 | 421 |
422 #wenn facetField existieren dann rufe facetierung auf | |
423 if len(facetFields)>0: | |
424 #for facet in facetFields: | |
425 | |
426 # res = res.facet_by(facet) | |
5 | 427 |
7 | 428 |
429 res = res.facet_by(facetFields) | |
0 | 430 |
431 #res=res.paginate(start=start, rows=rows).highlight("main_content") | |
432 | |
433 res=res.paginate(start=start, rows=rows) | |
434 | |
435 | |
4 | 436 #only highlighting if not searhc for only "*" - avoid max clause error |
2 | 437 if solrQuery=="*": |
3 | 438 |
4 | 439 |
2 | 440 res=res.paginate(start=start, rows=rows) |
441 else: | |
4 | 442 |
2 | 443 res=res.paginate(start=start, rows=rows).highlight(usePhraseHighlighter=True) |
0 | 444 |
10 | 445 |
446 if sorting is not None: | |
447 for sort in sorting: | |
448 res=res.sort_by(sort); | |
0 | 449 return res |
450 | |
451 | |
4 | 452 def replaceParameter(self,paramsNeu,queryString,ignore=[]): |
453 params=urlparse.parse_qs(queryString); | |
454 | |
455 for key in paramsNeu.keys(): | |
456 | |
457 params[key]=paramsNeu[key] | |
458 | |
459 for key in ignore: | |
460 del params[key] | |
461 | |
462 retArray = [] | |
463 for x in params.keys(): | |
464 for y in self.getList(params[x]): | |
465 retArray.append("%s=%s"%(x,urllib.quote(y))) | |
466 | |
467 print retArray | |
468 return "&".join(retArray); | |
0 | 469 #für die parameter @see prepareSearch |
470 #erzeugt eine Suchabfrage und führt diese aus. | |
471 #return {"result":response.result, "hl":response.highlighting,"facetFields":facetedFields} | |
472 | |
10 | 473 def search(self,solrQuery,facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,orSearch=None,facetFields_limit=None,trunc=False,sorting=None): |
8 | 474 |
475 | |
476 print trunc | |
477 if trunc: | |
478 if not solrQuery.endswith("*"): | |
479 solrQuery+="*" | |
0 | 480 |
10 | 481 res=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets,orSearch=orSearch,sorting=sorting) |
7 | 482 #response= res.execute() |
483 | |
484 opt = res.options(); | |
485 | |
486 | |
487 | |
488 if facetFields_limit: | |
489 | |
490 | |
491 for field,limit in facetFields_limit.items(): | |
492 opt["f.%s.facet.limit"%field]=limit | |
493 | |
494 | |
495 response= self._v_solr.search( **opt) | |
496 | |
0 | 497 #speichere faceted fields |
498 if len(facetFields)>0: | |
499 facetedFields=response.facet_counts.facet_fields | |
500 | |
501 if sortFacets: | |
502 facetedFields=self.sortFacetedFields(facetedFields) | |
503 | |
504 else: | |
505 facetedFields={} | |
506 | |
507 | |
508 | |
509 | |
510 return {"result":response.result, "hl":response.highlighting,"facetFields":facetedFields} | |
511 | |
512 | |
513 | |
10 | 514 #hilfsmethode zum <eren über der ranges |
0 | 515 def sortRanges(self,ranges): |
516 x=list(ranges) | |
517 x.sort() | |
518 return x | |
519 | |
520 #sortiert die Werte der FacetedFields | |
521 #(facetedFields ist ein hast mit feldname -> liste der (wert für das feld, anzahl der treffer für den wert) | |
522 #ausserdem werden die werte gemäß des angegebenen Filter gefiltert. | |
523 | |
524 def sortFacetedFields(self, facetedFields,filter=STOPLIST): | |
525 ret={} | |
526 | |
527 def cmpTuple(x,y): | |
528 return cmp(x[0],y[0]) | |
529 | |
530 | |
531 for key in facetedFields.keys(): | |
532 ls = facetedFields[key] | |
533 ls.sort(cmpTuple) | |
534 ret[key]=ls | |
535 | |
536 if filter.get(key,None): | |
537 ls2=[] | |
538 for x in ls: | |
539 if x[0].encode('utf-8') not in filter[key]: | |
540 ls2.append(x) | |
541 ret[key]=ls2 | |
542 | |
543 | |
544 ret[key]=[x for x in ret[key] if x[1]!=0] | |
545 return ret | |
546 | |
547 def changeMain(self,solrURL=None,title=None,REQUEST=None,RESPONSE=None): | |
548 """change main settings""" | |
549 if solrURL: | |
550 self.solrURL=solrURL | |
551 self.title=title | |
552 self._v_solr=sunburnt.SolrInterface(url=solrURL) | |
553 | |
554 if RESPONSE is not None: | |
555 RESPONSE.redirect('manage_main') | |
556 | |
557 | |
558 else: | |
559 pt=zptFile(self, 'zpt/ChangeZopeSolr.zpt') | |
560 return pt() | |
561 | |
562 #sucht die je nach einsteillung in solrconfig.xml Werte mit den häufigsten Treffern oder alphabetisch sortiert zu einem | |
563 #bestimmten eintrag aus solr | |
564 #gedacht ist die methoden für die Anwendung nach dem Harvesten einer Website, es wird daher davon ausgegangen, dass sie hinter der | |
565 #idfield eine url steht. Wir es z.b. bei Nutch passiert. index.htm/index_html als Teil der url wird dabei unterdrückt (analog zu den harbest einstellunge für | |
566 # nutch für zope webseiten. | |
567 #@param @idfield is hierbei der Name des Feldes, das in solrschema als id defniert wurde | |
568 #field der Feldname von dem die Treffer gesurcht wernde sollen | |
569 #url die url des textes | |
570 | |
571 def getTermsAsJSON(self,idfield,field,url): | |
572 """getTerms""" | |
573 | |
574 ret=[] | |
575 h = httplib2.Http() | |
576 url = url.replace("/index.html","").replace("/index_html","") | |
577 if url[-1]=="/": | |
578 url=url[0:-1] | |
579 | |
580 urlq=url.replace(":","\:") | |
581 urlq=urlq.replace("/","\/") | |
582 | |
4 | 583 #q ="http://localhost:8983/solr/mpiwgweb/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"%(idfield,urlq,field) |
584 q =self.solrURL+SOLRSERVER%(idfield,urlq,field) | |
0 | 585 |
586 resp, content = h.request(q) | |
587 | |
588 root = ET.fromstring(content) | |
589 #uri = "http://127.0.0.1:18080/www_neu/de/aktuelles/features/feature28" | |
590 | |
591 xpstr = ".//lst[@name='termVectors']/lst[@name='%s']/lst[@name='%s']/lst"%(url,field) | |
592 | |
593 | |
594 tvs = root.findall(xpstr) | |
595 | |
596 for tv in tvs: | |
597 wd = tv.attrib['name'] | |
598 for f in tv.findall("./int[@name='tf']"): | |
599 fre = f.text | |
600 | |
601 | |
602 if int(fre)>2: | |
603 | |
604 ret.append('{"text":"%s","size":%s}'%(wd,fre)) | |
605 | |
606 retStr="["+",".join(ret)+"]" | |
607 | |
608 return retStr | |
609 | |
610 #tauscht im request die in neewparams angegeben parameter aus. | |
611 def replaceParam(self, newparams): | |
612 x = self.REQUEST.form.copy() | |
613 | |
614 for key,value in newparams.items(): | |
615 x[key]=value | |
616 | |
617 | |
618 retls=[] | |
619 for k,v in x.items(): | |
620 if not isinstance(v,basestring): | |
621 for y in v: | |
622 retls.append((k,y)) | |
623 else: | |
624 retls.append((k,v)) | |
625 | |
626 return "?"+"&".join(["%s=%s"%(k,urllib.quote_plus(v,'/')) for (k, v) in retls]) | |
627 | |
628 | |
629 | |
630 | |
631 #ruft @set ranges aus, gibt das ergebnis als json zurück | |
632 def getRangesAsJSON(self,field,begin,end,increment): | |
633 """ getRangesAsJSON""" | |
634 res = self.ranges(field, int(begin), int(end), int(increment)) | |
635 return json.dumps(res) | |
636 | |
637 | |
638 #return only the values of resultList whicht start with startLetter or if starLetterNonAscii all values which | |
639 #start with an non ascii character | |
640 def filter (self,resultList,startLetter=None,startLetterNonAscii=0): | |
1 | 641 ls=[] |
0 | 642 if startLetter: |
4 | 643 startLetter=startLetter.lower() |
0 | 644 |
645 matchStr = "[\[\]'\"]*"+startLetter | |
4 | 646 ls = [x for x in resultList if re.match(matchStr,x[0].lower())] |
0 | 647 |
648 if startLetterNonAscii ==1: | |
649 | |
650 ls = [x for x in resultList if not re.match("[\[\]'\"a-zA-Z].*",x[0])] | |
651 return ls | |
652 | |
4 | 653 |
654 | |
0 | 655 def manage_addZopeSolrForm(self): |
656 """Form for external Links""" | |
657 pt=zptFile(self, 'zpt/AddZopeSolr.zpt') | |
658 return pt() | |
659 | |
660 | |
661 def manage_addZopeSolr(self,id,title,solrURL,RESPONSE=None): | |
662 """Add an external Link""" | |
663 | |
664 newObj=ZopeSolr(id,title,solrURL) | |
665 | |
666 self._setObject(id,newObj) | |
667 | |
668 | |
669 if RESPONSE is not None: | |
670 RESPONSE.redirect('manage_main') | |
4 | 671 |