def make_schema(): return Schema(title=TEXT(stored=True, sortable=True), path=ID(stored=True, sortable=True), section=ID(stored=True), checksum=STORED, content=TEXT, priority=COLUMN(columns.NumericColumn("i")))
def add_sortable(writer, fieldname, facet, column=None): """Adds a per-document value column to an existing field which was created without the ``sortable`` keyword argument. >>> from whoosh import index, sorting >>> ix = index.open_dir("indexdir") >>> with ix.writer() as w: ... facet = sorting.FieldFacet("price") ... sorting.add_sortable(w, "price", facet) ... :param writer: a :class:`whoosh.writing.IndexWriter` object. :param fieldname: the name of the field to add the per-document sortable values to. If this field doesn't exist in the writer's schema, the function will add a :class:`whoosh.fields.COLUMN` field to the schema, and you must specify the column object to using the ``column`` keyword argument. :param facet: a :class:`FacetType` object to use to generate the per-document values. :param column: a :class:`whosh.columns.ColumnType` object to use to store the per-document values. If you don't specify a column object, the function will use the default column type for the given field. """ storage = writer.storage schema = writer.schema field = None if fieldname in schema: field = schema[fieldname] if field.column_type: raise Exception("%r field is already sortable" % fieldname) if column: if fieldname not in schema: from whoosh.fields import COLUMN field = COLUMN(column) schema.add(fieldname, field) else: if fieldname in schema: column = field.default_column() else: raise Exception("Field %r does not exist" % fieldname) searcher = writer.searcher() catter = facet.categorizer(searcher) for subsearcher, docoffset in searcher.leaf_searchers(): catter.set_searcher(subsearcher, docoffset) reader = subsearcher.reader() if reader.has_column(fieldname): raise Exception("%r field already has a column" % fieldname) codec = reader.codec() segment = reader.segment() colname = codec.column_filename(segment, fieldname) colfile = storage.create_file(colname) try: colwriter = column.writer(colfile) for docnum in reader.all_doc_ids(): v = catter.key_to_name(catter.key_for(None, docnum)) cv = field.to_column_value(v) colwriter.add(docnum, cv) colwriter.finish(reader.doc_count_all()) finally: colfile.close() field.column_type = column