[pylucene-dev] TopFieldDocs returned from indexSearcher are wrong

Andi Vajda vajda at osafoundation.org
Sat Sep 9 11:06:47 PDT 2006


On Sat, 9 Sep 2006, Yura Smolsky wrote:

> object of TopFieldDocs returned from
> IndexSearcher.search(Weight weight, Filter filter, int nDocs, Sort
> sort) is wrong. Here is piece of code:
>
> from PyLucene import *
>
> dir = FSDirectory.getDirectory("../../index/index", False)
> searcher = IndexSearcher(dir)
> query = QueryParser("summary", StandardAnalyzer()).parse("good")
> weight = query.weight(searcher)
> print 'weight:', weight
> tfd = searcher.search(weight, None, 10, Sort())
> print 'TopFieldDocs:', tfd
> print 'TopFieldDocs.fields:', tfd.fields
>
>
> It tells me this:
>
> weight: weight(summary:good)
> TopFieldDocs: org.apache.lucene.search.TopFieldDocs at 15bc048
> TopFieldDocs.fields:
> Traceback (most recent call last):
>  File "TopFieldDoc.py", line 14, in ?
>    print 'TopFieldDocs.fields:', tfd.fields
> AttributeError: 'PyLucene.TopDocs' object has no attribute 'fields'

The Searchable.search(Weight, Filter, int, Sort) wrapper was wrapping the 
return value with a FieldDocs instead of a TopFieldDocs. This is fixed in the 
attached patch and in svn.

Thank you for finding this !

Andi..
-------------- next part --------------
Index: lucene.cpp
===================================================================
--- lucene.cpp	(revision 292)
+++ lucene.cpp	(working copy)
@@ -10296,7 +10296,8 @@
 
 static PyObject *j_searchable_search(j_searchable *self, PyObject *args)
 {
-    org::apache::lucene::search::TopDocs *docs;
+    org::apache::lucene::search::TopDocs *td;
+    org::apache::lucene::search::TopFieldDocs *tfd;
     org::apache::lucene::search::Weight *weight;
     org::apache::lucene::search::Filter *filter;
     org::apache::lucene::search::Sort *sort;
@@ -10310,8 +10311,8 @@
                        &org::apache::lucene::search::Filter::class$,
                        check_Filter, &weight, &filter, make_Filter, &n))
         {
-            OBJ_CALL(docs = self->object->search(weight, filter, n));
-            return wrap_TopDocs(docs);
+            OBJ_CALL(td = self->object->search(weight, filter, n));
+            return wrap_TopDocs(td);
         }
         if (!parseArgs(args, "JPP",
                        &org::apache::lucene::search::Weight::class$,
@@ -10333,8 +10334,8 @@
                        &org::apache::lucene::search::Sort::class$,
                        &weight, &filter, make_Filter, &n, &sort))
         {
-            OBJ_CALL(docs = self->object->search(weight, filter, n, sort));
-            return wrap_TopDocs(docs);
+            OBJ_CALL(tfd = self->object->search(weight, filter, n, sort));
+            return wrap_TopFieldDocs(tfd);
         }
         break;
     }


More information about the pylucene-dev mailing list