[Zope3-Users] Fwd: Search multiple fields with TextIndex
Massimiliano della Rovere
massimiliano.dellarovere at gmail.com
Fri Feb 20 03:10:38 EST 2009
I originally sent this message by mistake only to Chiristian who
replied to my previous one.
I send a copy to the mailing list in case it may be useful for someone else too.
---------- Forwarded message ----------
From: Massimiliano della Rovere <massimiliano.dellarovere at gmail.com>
Date: Mon, Feb 16, 2009 at 17:42
Subject: Re: [Zope3-Users] Search multiple fields with TextIndex
To: Christian Lück <christian.lueck at ruhr-uni-bochum.de>
Another question is:
is there a way to automatically create TextIndices for certain (all)
fields of an interface?
On Mon, Feb 16, 2009 at 17:23, Massimiliano della Rovere
<massimiliano.dellarovere at gmail.com> wrote:
>
> Probably because I am a zope newbie, I have some problems in understanding how queries are managed.
>
> I am reading von Weithershausen book, and I notice that the SearchPage.__call__ method takes the query parameter. How does zope know that the query (I guess it is request.query or request.form.query; I wish zope had an interactive debugger with inspector) paramter fromthe search viewlet must be passed to the __call__method?
> parameter name matching?
>
> I have the usual interface with the autohor, subject and location fields (the real class has over 30 fields).
> I created a search page with a form containing a field for each attribute, implemented a class derived from FormBase and action attribut of the form tag pointing to the view that should perform the search.
>
> I am thinking how the request to the catalogo.searchResults should receive the parameter ttyped by the user (there could be less parameter than the search fields).
>
> I implemented a few bits to try to realize what I wrote.
> We have the class preparing the catalog and indices when a site istance is created:
> @adapter(IEventoNuovoSitoMabon)
> def catalogo_e_indice( evento ):
> gs = evento.object.getSiteManager()
>
> intids = IntIds()
> gs['intids'] = intids
> gs.registerUtility( intids, IIntIds )
>
> catalogo = Catalog()
> gs['catalogo'] = catalogo
> gs.registerUtility( catalogo, ICatalog )
>
> campi = [ i.__name__ for i in Fields(IScheda) ] #.omit('__name__', '__parent__', 'titolo') ]
>
> for i in campi:
> testuale = TextIndex(
> interface = ISearchableText,
> field_name = i,
> field_callable = False
> )
> catalogo[i] = testuale
>
> semplice = TextIndex(
> interface = ISearchableText,
> field_name = 'getSearchableText',
> field_callable = True
> )
> catalogo[u'semplice'] = semplice
>
>
> and the data extractor:
> class TestoSchedaPerRicerca(object):
> """Estrattore del testo per le ricerche"""
> implements(ISearchableText)
> adapts(IScheda)
>
> def __init__( self, context ):
> self.context = context
>
> def __getattr__( self, attr ):
> try:
> return self.context.__dict__[attr]
> except KeyError:
> raise AttributeError( attr )
>
> def getSearchableText( self ):
> return self.context.autore + u' : ' + self.context.soggetto
>
> But now when I add a Scheda object I get the following error:
>
> 2009-02-16T17:17:33 ERROR SiteError http://localhost:9673/mabon/schede/+/mabon.Scheda%3D
> Traceback (most recent call last):
> File "/usr/lib/python2.4/site-packages/zope/publisher/publish.py", line 133, in publish
> result = publication.callObject(request, obj)
> File "/usr/lib/python2.4/site-packages/zope/app/publication/zopepublication.py", line 161, in callObject
> return mapply(ob, request.getPositionalArguments(), request)
> File "/usr/lib/python2.4/site-packages/zope/publisher/publish.py", line 108, in mapply
> return debug_call(obj, args)
> - __traceback_info__: <security proxied zope.app.publisher.browser.viewmeta.ModuloAggiungiScheda instance at 0xa87036c>
> File "/usr/lib/python2.4/site-packages/zope/publisher/publish.py", line 114, in debug_call
> return obj(*args)
> File "/usr/lib/python2.4/site-packages/zope/formlib/form.py", line 769, in __call__
> self.update()
> File "/usr/lib/python2.4/site-packages/zope/formlib/form.py", line 750, in update
> result = action.success(data)
> File "/usr/lib/python2.4/site-packages/zope/formlib/form.py", line 594, in success
> return self.success_handler(self.form, self, data)
> File "/usr/lib/python2.4/site-packages/zope/formlib/form.py", line 861, in handle_add
> self.createAndAdd(data)
> File "/usr/lib/python2.4/site-packages/zope/formlib/form.py", line 868, in createAndAdd
> return self.add(ob)
> File "/usr/lib/python2.4/site-packages/zope/formlib/form.py", line 877, in add
> ob = self.context.add(object)
> File "/usr/lib/python2.4/site-packages/zope/app/container/browser/adding.py", line 72, in add
> container[name] = content
> File "/usr/lib/python2.4/site-packages/zope/app/container/sample.py", line 86, in __setitem__
> setitem(self, self.__data.__setitem__, key, object)
> File "/usr/lib/python2.4/site-packages/zope/app/container/contained.py", line 593, in setitem
> notify(event)
> File "/usr/lib/python2.4/site-packages/zope/event/__init__.py", line 23, in notify
> subscriber(event)
> File "/usr/lib/python2.4/site-packages/zope/component/event.py", line 26, in dispatch
> for ignored in zope.component.subscribers(event, None):
> File "/usr/lib/python2.4/site-packages/zope/component/_api.py", line 130, in subscribers
> return sitemanager.subscribers(objects, interface)
> File "/usr/lib/python2.4/site-packages/zope/component/registry.py", line 290, in subscribers
> return self.adapters.subscribers(objects, provided)
> File "/usr/lib/python2.4/site-packages/zope/interface/adapter.py", line 535, in subscribers
> subscription(*objects)
> File "/usr/lib/python2.4/site-packages/zope/component/event.py", line 33, in objectEventNotify
> adapters = zope.component.subscribers((event.object, event), None)
> File "/usr/lib/python2.4/site-packages/zope/component/_api.py", line 130, in subscribers
> return sitemanager.subscribers(objects, interface)
> File "/usr/lib/python2.4/site-packages/zope/component/registry.py", line 290, in subscribers
> return self.adapters.subscribers(objects, provided)
> File "/usr/lib/python2.4/site-packages/zope/interface/adapter.py", line 535, in subscribers
> subscription(*objects)
> File "/usr/lib/python2.4/site-packages/zope/app/intid/__init__.py", line 169, in addIntIdSubscriber
> notify(IntIdAddedEvent(ob, event))
> File "/usr/lib/python2.4/site-packages/zope/event/__init__.py", line 23, in notify
> subscriber(event)
> File "/usr/lib/python2.4/site-packages/zope/component/event.py", line 26, in dispatch
> for ignored in zope.component.subscribers(event, None):
> File "/usr/lib/python2.4/site-packages/zope/component/_api.py", line 130, in subscribers
> return sitemanager.subscribers(objects, interface)
> File "/usr/lib/python2.4/site-packages/zope/component/registry.py", line 290, in subscribers
> return self.adapters.subscribers(objects, provided)
> File "/usr/lib/python2.4/site-packages/zope/interface/adapter.py", line 535, in subscribers
> subscription(*objects)
> File "/usr/lib/python2.4/site-packages/zope/app/catalog/catalog.py", line 153, in indexDocSubscriber
> cat.index_doc(id, ob)
> File "/usr/lib/python2.4/site-packages/zope/app/catalog/catalog.py", line 62, in index_doc
> index.index_doc(docid, texts)
> File "/usr/lib/python2.4/site-packages/zope/app/catalog/attribute.py", line 144, in index_doc
> return super(AttributeIndex, self).index_doc(docid, value)
> File "/usr/lib/python2.4/site-packages/zope/index/text/textindex.py", line 45, in index_doc
> self.index.index_doc(docid, text)
> File "/usr/lib/python2.4/site-packages/zope/index/text/okapiindex.py", line 225, in index_doc
> count = BaseIndex.index_doc(self, docid, text)
> File "/usr/lib/python2.4/site-packages/zope/index/text/baseindex.py", line 95, in index_doc
> wids = self._lexicon.sourceToWordIds(text)
> File "/usr/lib/python2.4/site-packages/zope/index/text/lexicon.py", line 66, in sourceToWordIds
> for t in last:
> TypeError: iteration over non-sequence
--
Se proprio dovete inserirmi in una mail in una
lista con indirizzi, vi prego di mettere il mio
nel campo CCN: o BCC: e non in TO: CC: oppure A:
------------
skype: masdero, icq: 473891447, yim: mas_dero, msn: mas_dero at hotmail.com
------------
Mi scriva in italiano; Write me in English; Skribu al mi Esperante!
------------
Volete farmi un regalo a natale e non sapete cosa? :D
http://www.boardgamegeek.com/collection/user/masdero?sort=wishlist&sortdir=asc&columns=title|thumbnail|status|rating|bggrating|plays|comment|commands&wishlist=1&ff=1
--
Se proprio dovete inserirmi in una mail in una
lista con indirizzi, vi prego di mettere il mio
nel campo CCN: o BCC: e non in TO: CC: oppure A:
------------
skype: masdero, icq: 473891447, yim: mas_dero, msn: mas_dero at hotmail.com
------------
Mi scriva in italiano; Write me in English; Skribu al mi Esperante!
------------
Volete farmi un regalo a natale e non sapete cosa? :D
http://www.boardgamegeek.com/collection/user/masdero?sort=wishlist&sortdir=asc&columns=title|thumbnail|status|rating|bggrating|plays|comment|commands&wishlist=1&ff=1
More information about the Zope3-users
mailing list