============================== How to implement a new backend ============================== Index ===== * Subclass :class:`whoosh.index.Index`. * Indexes must implement the following methods. * :meth:`whoosh.index.Index.is_empty` * :meth:`whoosh.index.Index.doc_count` * :meth:`whoosh.index.Index.reader` * :meth:`whoosh.index.Index.writer` * Indexes that require/support locking must implement the following methods. * :meth:`whoosh.index.Index.lock` * :meth:`whoosh.index.Index.unlock` * Indexes that support deletion must implement the following methods. * :meth:`whoosh.index.Index.delete_document` * :meth:`whoosh.index.Index.doc_count_all` -- if the backend has delayed deletion. * Indexes that require/support versioning/transactions *may* implement the following methods. * :meth:`whoosh.index.Index.latest_generation` * :meth:`whoosh.index.Index.up_to_date` * :meth:`whoosh.index.Index.last_modified` * Index *may* implement the following methods (the base class's versions are no-ops). * :meth:`whoosh.index.Index.optimize` * :meth:`whoosh.index.Index.close` IndexWriter =========== * Subclass :class:`whoosh.writing.IndexWriter`. * IndexWriters must implement the following methods. * :meth:`whoosh.writing.IndexWriter.add_document` * :meth:`whoosh.writing.IndexWriter.add_reader` * Backends that support deletion must implement the following methods. * :meth:`whoosh.writing.IndexWriter.delete_document` * IndexWriters that work as transactions must implement the following methods. * :meth:`whoosh.reading.IndexWriter.commit` -- Save the additions/deletions done with this IndexWriter to the main index, and release any resources used by the IndexWriter. * :meth:`whoosh.reading.IndexWriter.cancel` -- Throw away any additions/deletions done with this IndexWriter, and release any resources used by the IndexWriter. IndexReader =========== * Subclass :class:`whoosh.reading.IndexReader`. * IndexReaders must implement the following methods. * :meth:`whoosh.reading.IndexReader.__contains__` * :meth:`whoosh.reading.IndexReader.__iter__` * :meth:`whoosh.reading.IndexReader.iter_from` * :meth:`whoosh.reading.IndexReader.stored_fields` * :meth:`whoosh.reading.IndexReader.doc_count_all` * :meth:`whoosh.reading.IndexReader.doc_count` * :meth:`whoosh.reading.IndexReader.doc_field_length` * :meth:`whoosh.reading.IndexReader.field_length` * :meth:`whoosh.reading.IndexReader.max_field_length` * :meth:`whoosh.reading.IndexReader.postings` * :meth:`whoosh.reading.IndexReader.has_vector` * :meth:`whoosh.reading.IndexReader.vector` * :meth:`whoosh.reading.IndexReader.doc_frequency` * :meth:`whoosh.reading.IndexReader.frequency` * Backends that support deleting documents should implement the following methods. * :meth:`whoosh.reading.IndexReader.has_deletions` * :meth:`whoosh.reading.IndexReader.is_deleted` * Backends that support versioning should implement the following methods. * :meth:`whoosh.reading.IndexReader.generation` * If the IndexReader object does not keep the schema in the ``self.schema`` attribute, it needs to override the following methods. * :meth:`whoosh.reading.IndexReader.field` * :meth:`whoosh.reading.IndexReader.field_names` * :meth:`whoosh.reading.IndexReader.scorable_names` * :meth:`whoosh.reading.IndexReader.vector_names` * IndexReaders *may* implement the following methods. * :meth:`whoosh.reading.DocReader.close` -- closes any open resources associated with the reader. Matcher ======= The :meth:`whoosh.reading.IndexReader.postings` method returns a :class:`whoosh.matching.Matcher` object. You will probably need to implement a custom Matcher class for reading from your posting lists. * Subclass :class:`whoosh.matching.Matcher`. * Implement the following methods at minimum. * :meth:`whoosh.matching.Matcher.is_active` * :meth:`whoosh.matching.Matcher.copy` * :meth:`whoosh.matching.Matcher.id` * :meth:`whoosh.matching.Matcher.next` * :meth:`whoosh.matching.Matcher.value` * :meth:`whoosh.matching.Matcher.value_as` * :meth:`whoosh.matching.Matcher.score` * Depending on the implementation, you *may* implement the following methods more efficiently. * :meth:`whoosh.matching.Matcher.skip_to` * :meth:`whoosh.matching.Matcher.weight` * If the implementation supports quality, you should implement the following methods. * :meth:`whoosh.matching.Matcher.supports_quality` * :meth:`whoosh.matching.Matcher.quality` * :meth:`whoosh.matching.Matcher.block_quality` * :meth:`whoosh.matching.Matcher.skip_to_quality`