/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_document_Document_ #define _lucene_document_Document_ #if defined(_LUCENE_PRAGMA_ONCE) # pragma once #endif #include "Field.h" ///todo: jlucene has change from using DocumentFieldList/Enumeration ///to using a java List... do we want to do this too? CL_NS_DEF(document) ///\exclude Internal field enumeration class DocumentFieldList :LUCENE_BASE{ public: DocumentFieldList(Field* f, DocumentFieldList* n); ~DocumentFieldList(); Field* field; DocumentFieldList* next; }; class DocumentFieldEnumeration :LUCENE_BASE{ private: const DocumentFieldList* fields; public: DocumentFieldEnumeration(const DocumentFieldList* fl); ~DocumentFieldEnumeration(); bool hasMoreElements() const; Field* nextElement(); }; /** Documents are the unit of indexing and search. * * A Document is a set of fields. Each field has a name and a textual value. * A field may be {@link Field#isStored() stored} with the document, in which * case it is returned with search hits on the document. Thus each document * should typically contain one or more stored fields which uniquely identify * it. * *

Note that fields which are not {@link Field#isStored() stored} are * not available in documents retrieved from the index, e.g. with {@link * Hits#doc(int32_t)}, {@link Searcher#doc(int32_t)} or {@link * IndexReader#document(int32_t)}. */ class Document:LUCENE_BASE { private: DocumentFieldList* fieldList; float_t boost; public: Document(); ~Document(); /** *

Adds a field to a document. Several fields may be added with * the same name. In this case, if the fields are indexed, their text is * treated as though appended for the purposes of search.

*

Note that add like the removeField(s) methods only makes sense * prior to adding a document to an index. These methods cannot * be used to change the content of an existing index! In order to achieve this, * a document has to be deleted from an index and a new changed version of that * document has to be added.

* */ void add(Field& field); /** Returns a field with the given name if any exist in this document, or * null. If multiple fields exists with this name, this method returns the * first value added. * Note: name is case sensitive */ Field* getField(const TCHAR* name) const; /** Returns the string value of the field with the given name if any exist in * this document, or null. If multiple fields exist with this name, this * method returns the first value added. If only binary fields with this name * exist, returns null. */ const TCHAR* get(const TCHAR* field) const; /** Returns an Enumeration of all the fields in a document. */ DocumentFieldEnumeration* fields() const; /** Prints the fields of a document for human consumption. */ TCHAR* toString() const; /** Sets a boost factor for hits on any field of this document. This value * will be multiplied into the score of all hits on this document. * *

Values are multiplied into the value of {@link Field#getBoost()} of * each field in this document. Thus, this method in effect sets a default * boost for the fields of this document. * * @see Field#setBoost(float_t) */ void setBoost(float_t boost); /** Returns the boost factor for hits on any field of this document. * *

The default value is 1.0. * *

Note: This value is not stored directly with the document in the index. * Documents returned from {@link IndexReader#document(int32_t)} and * {@link Hits#doc(int32_t)} may thus not have the same value present as when * this document was indexed. * * @see #setBoost(float_t) */ float_t getBoost() const; /** *

Removes field with the specified name from the document. * If multiple fields exist with this name, this method removes the first field that has been added. * If there is no field with the specified name, the document remains unchanged.

*

Note that the removeField(s) methods like the add method only make sense * prior to adding a document to an index. These methods cannot * be used to change the content of an existing index! In order to achieve this, * a document has to be deleted from an index and a new changed version of that * document has to be added.

* Note: name is case sensitive */ void removeField(const TCHAR* name); /** *

Removes all fields with the given name from the document. * If there is no field with the specified name, the document remains unchanged.

*

Note that the removeField(s) methods like the add method only make sense * prior to adding a document to an index. These methods cannot * be used to change the content of an existing index! In order to achieve this, * a document has to be deleted from an index and a new changed version of that * document has to be added.

* Note: name is case sensitive */ void removeFields(const TCHAR* name); /** * Returns an array of values of the field specified as the method parameter. * This method can return null. * Note: name is case sensitive * * @param name the name of the field * @return a String[] of field values */ TCHAR** getValues(const TCHAR* name); }; CL_NS_END #endif