Chris Hostetter wrote:

: Wouldn't subclassing ReadOnlyDocument also work in this case, if you override : the getField* to do your own new logic if it applies else fallback to super?

Sure, but how will IndexReader (or really FieldsReader) know which
subclass to instantiate?

IndexReader would not instantiate a subclass in this example. I was just saying your wrapping example doesn't require an interface: it works equally well if ReadOnlyDocument is a concrete class. I think moving away from interfaces for 3.0 makes sense.

I think in LUCENE-778 the notion of passing a
DocumentFactory to IndexReader was brought up; in another reply to this thread robert suggests having a setter that takes in a Class which has a
noarg constructor and using reflect -- both of these could work, but
frankly having a really simple API that allows for object decoration seems
cleaner to me.

I think whether IndexReader should be able to instantiate an app- specific subclass for a returned document is a somewhat orthogonal question here. I agree it would be nice to be able to do this, though I do wonder if we are "going too far in being flexible". Would we also offer app-specific per-field classes? Lucene is a search engine and if you want to do neat custom application classes above it it seems like it should remain above the API with decoration. Ie I do like the simplicity of Yonik's document() returning Map<String,String[]>.

: approach. People who are careful (store enough fields, don't use boosting or : have separate store for their boosting) could pull Documents from a reader,
: tweak them, and build a new index.

this to me is the strongest reason to have seperate classes, where neither
is the base class for the other -- we want to discourage the casual
observer from assuming this is simple. we want to make sure that users
who want to do this have to go out of their way to have to write the
translation from SearchResultDocument to IndexableDocument so it's clear to them what they might be losing in the translation. (incidently: this
is another topic that came up in LUCENE-778...
https://issues.apache.org/jira/browse/LUCENE-778? focusedCommentId=12478169#action_12478169
)

Agreed, it's a dangerous trap to make this look simple. EG, I just discovered that if you call "isIndexed()" on a Fieldable in the document returned by an IndexReader, it can lie, because it falls back to FieldInfos to check that field. But this is not right since on adding the one doc you could have specified NOT to index that one field and only store it. Also, getBoost() doesn't survive indexing. In short, it's buggy, today, that we try to act like a retrieved document has faithfully preserved these detailed index-time settings.

fundementally, i believe
* the API for objects that are passed to "indexing" should only require
"getters" that are essential for understanding how to indexing
that document. ie: if indexing happens by calling
IndexWriter.addDocument(IndexableDoc) then the IndexableDoc API should
only require that there is a way to "get" IndexableFields and other
options, IndexableField should only describe how to "get" the field name and field value and; the client providing the IndexableDoc should be free to provide an object that implements those methods any way it sees fit -- we will most likely want to provde "simple" concrete subclasses of these
APIs that have simple setters to meet the common cases -- but the
IndexWriter methods should know only about the "API" classes.
* the API for objects that are returned from "reading/searching" should
only specify "getters" that are essential for the client to understand
the data the index knows about those documents.  "setters" used by
IndexReader (or it's internals) shouldn't be exposed by this API unless we
*truely* want to let clients treat those objects as mutabl "Beans" for
their own purposes ... personally, i think it's safer to make it easy
to decorate those objects then to allow arbitrary modifications.

I like this approach.

So the IndexableDocument abstract base class would only define getters. Document (in oal.index package) would subclass this, adding basic setters. Likewise for Field, along with the getter/setters for indexing details like different term vector, stored, index settings.

StoredDocument abstract base class would only define getters. There would be a (package-)private class in oal.search that subclasses this and adds private setters. Likewise for Field, or, maybe StoredDocument deals directly in String and doesn't make Field classes (Yonik's idea).


: Actually I think they do share alot more than just name of the field? : Accessing the "stored" value of a document is exactly what indexing needs to : do when it indexes the document in the first place? Ie, a "stored" document : "looks alot like" the document at indexing time that had been stored. And

i think the stored value looks alot like the value stored during index
because of the perspective we look at them from ... but a Document
returned from a search just has Fields with "Values" while a document that
needs to to be indexed will have Fields with "Values To Store" and
Fields with "Values To Index" and Fields with both ... there's really no
reason for a single method in a common base class to describe those
things.

OK I now agree with this. I don't think Lucene should be trying to preserve all the index-time settings through to search-time, because it's buggy now and it's not really necessary.

: things like isTokenized, isTermVectorStored, isStoreOffsetWithTermVector, : isBinary are actually preserved in the index and known to the reader, so it's
: worth having these methods available at search time?

I admit, some of those is*() methods might make sense in a common base
class -- but not all of them are specific to each instance of Field. Some are the least common denominator of all Fields indexed with the same name
added -- it's convinient to return that info as part of each Field
instance so thatthe client doesn't have to go call some method in
IndexReader (ie: reader.isTermVectorStored(fieldName)) but providing it to
the client using the same method (not just a method with a similar, or
identical name, but the *exact* same method as defined by a common
baseclass) is very confusing when that method returns something different
then what is was when the client orriginally indexed that document.

I've flipped here and would be happy not to expose any of this API in the returned document.

Mike

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to