[Zope3-Users] Fwd: Search multiple fields with TextIndex

Massimiliano della Rovere massimiliano.dellarovere at gmail.com
Fri Feb 20 03:13:52 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: Wed, Feb 18, 2009 at 21:09
Subject: Re: [Zope3-Users] Search multiple fields with TextIndex
To: Christian Lück <christian.lueck at ruhr-uni-bochum.de>


On Tue, Feb 17, 2009 at 23:50, Christian Lück
<christian.lueck at ruhr-uni-bochum.de> wrote:
> Massimiliano della Rovere wrote:
>> Another question is:
>> is there a way to automatically create TextIndices for certain (all) fields
>> of an interface?
>
> No, I think there's not. The event subscriber to IEventoNuovoSiteMabon
> is the way to go.
> Instead of using a field manager :) I suggest you use the api of
> zope.interface and zope.schema to iterate over the fields and drop some.
> See p.64 of Philipp's book (third edition).
I use the Field manager because I find the omit function more elegant
than an "if" in a iterator:
campi = [ campo for campo in zope.schema.getFieldNames(IScheda) if
campo not in ('__name__', '__parent__', 'titolo') ]

> form zope.app.catalog.text import TextIndex
>
> def catalogo_e_indice(event):
>  gs = event.object.getSiteManager()
>
>  ... # create intid utility and catalog as you did
>
>  for campo in zope.schema.getFieldNames(IScheda):
>    if not campo in ('__name__', '__parent__', 'some_field_I_want_to_drop'):
>      catalogo[campo] = TextIndex(
>        interface = IScheda,
>        field_name = campo,
>        field_callable = False)
there is something strange in my opinion using this method.
When I specify the interface=IScheda, I do not link the data extractor
to the actual istance of the Scheda class.
On the contrary using an adapter, like TestoSchedaPerRicerca (see
below), the istance which to extract the data from is passed as
context.

When I use this method I receive the following error:
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
0xa89c4cc>
 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



>>> 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 ):
I use the __getattr__ so that when the TestoSchedaPerRicerca is asked
for an attribute matching the name of those specified in the Index
definition:
       for i in campi:
               testuale = TextIndex(
                       interface = ISearchableText,
                       field_name = i,
                       field_callable = True
               )
               catalogo[i] = testuale

> # What is this method for? Does ISearchableText subclass IScheda?
No.
ISearchableText is an interface created to be used in conjuction with
Index creation.
It is in "zope.index.text.interfaces".



-- 
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