我有一个图书数据库,它有三个实体:图书、页面和标题(在页面中找到的标题)。我对模式设计中的两种方法之间的性能感到困惑和担忧:
1-将书籍作为文档处理,即书籍字段、页面字段和标题字段。在这种方法中,所有的书籍数据都将在一个Solr文档中用非常大的字段表示。
2-将页面处理为文档,这将导致更小的字段,但文档数量更大。
我试着查阅了这份官方资料,但没能为我的问题找到一个明确的答案。
假设您要获取Solr结果并通过另一个应用程序显示它们,我会将最小的项-标题-作为文档的模型,这将使显示结果的位置更加容易。这样做可以最大限度地减少您需要编写的应用程序代码量。如果你的用户直接查询Solr,我可能会使用Page作为我的文档——大概你是在使用Solr的突出显示功能,然后帮助你的用户识别他们的搜索词是如何匹配的。
对于标题文档,我会对模式进行如下建模:
- 图书ID+页码+标题[string-唯一键]
- 书本ID[inter]
- 图书名称[标记文本字段]
- 页码[TrieIntField]
- 标题[标记文本字段]
- 该书/标题/页面组合的内容[标记文本字段]
您可能想要捕获其他属性,如作者、出版日期、出版商,但您没有在上面解释您拥有的其他信息,因此我将其排除在本示例之外。
然后,文本查询可能涉及Book Name
、Title
和Content
,您可能希望定义一个已索引但未存储的字段,该字段用作schema.xml中<copyField/>
声明的目标,以便同时轻松搜索这三个字段。
对于索引,在不了解更多索引数据的情况下,我会使用ICU Tokenizer和Snowball Porter Stemming Filter,并在文本字段上指定语言规范来处理非英语数据——假设所有书籍都使用相同的语言。如果是英语,则使用标准代币化器而不是ICU。