[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