我建议您将文本完整存储一次,然后使用灵活的类层次结构来索引内容。
我只在特殊的地方放置了 Hibernate 注释。
您创建一个容器来保存文本本身和部件对象:
public class DocumentContainer extends Model {
// Column definition depends on the DB, here: MySQL
@Column(columnDefinition="LONGTEXT")
public String text;
public Set<DocumentPart> documentParts;
}
文档的一部分定义在文本的某个区域上,属于某种类型,可以引用文档的其他部分:
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="partType")
public class DocumentPart extends Model {
Document document;
// indices over the documents text for this part
int startIndex;
int endIndex;
@Enumerated(EnumType.STRING)
PartType partType;
Set<DocumentPart> referencedParts;
}
public enum PartType {
DOCUMENT, PARAGRAPH, TOKEN
}
一个段落将是,例如:
@Entity
@DiscriminatorValue("PARAGRAPH")
public class Paragraph extends DocumentPart {
Set<Token> tokens;
}
通过这种方式,您可以灵活地确定文档上的区域类型,并且可以保留整个文档(包括标点符号等)。