首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

利用开源的 Apache Solr 搜索引擎构建 RESTful 基础存储服务(6)

利用开源的 Apache Solr 搜索引擎构建 RESTful 基础存储服务(6)

BLOG 网站的实现BLOG 网站使用 Java 语言开发,在使用 Apache Solr 进行数据存储的时候直接将 Java 对象保存在存储库中,当然这个过程中需要进行 Java 对象到 XML 的变换。同样进行检索处理的时候还需要将返回的 XML 格式的检索结果变换成 Java 对象。
注:Solrj 提供了对 Java 对象到 Solr 需要 XML 格式的文档的变换处理(或反向),但是因为我们的例子需要特殊的 URL 信息,所以例子程序对这部分处理进行了定制,并没有直接使用 Solrj 的实现。
例子程序的 URL 结构设计
在本文的例子程序的实现中,基础资源的 URL结构是:resource-type/id,其中 resource-type是指要进行存储的 Java 对象的类名;id是指在 resource-type限定的范围内能唯一地标识资源的信息,例如在本文的例子中,基础资源 Blogger 对象(假设 Blogger 的名字是 bob)URL 是:
1
org.apache.solr.blogsample.Blogger/bob。




附属资源使用的 URL 形式是:BASE_RESOURCE_URL/attribute/id,这里的 BASE_RESOURCE_URL代表被附属资源附属的基础资源的 URL;attribute表示的是附属资源附属在基础资源中的属性名。id是指在 BASE_RESOURCE_URL/attribute限定的范围内能唯一地标识资源的信息。例如,在本文的例子中,Article 是基础资源,而 Article 的 Review 就是 Article 的附属资源,如果一个 Article 的 URL 是:
1
org.apache.solr.blogsample.Article/0




而第一个 Review 的 URL 是:
1
org.apache.solr.blogsample.Article/0/reviews/0




这里的 reviews 实际上就是 Article 对象中的、用来容纳 Review 信息的属性名。
在不同的应用系统中,基础资源和附属资源的划分根据实际应用的设计思路的不同,其划分也不尽相同。例如:在文中的例子中,Blogger 和 Article 被看作是两种基础资源,所以其 URL 分别是:
1
2
org.apache.solr.blogsample.Blogger/bob
org.apache.solr.blogsample.Article/0




而 Review 被看作是 Article 的附属资源,所以其 URL 是:
1
org.apache.solr.blogsample.Article/0/reviews/0




但是如果设计上考虑将 Article 定义为 Blogger 的附属资源,这个时候 Article 的 URL 就可能是:
1
org.apache.solr.blogsample.Blogger/bob/articles/0




而 Article 对应的 Review 的 URL 格式就变成了:
1
org.apache.solr.blogsample.Blogger/bob/articles/0/reviews/0




使用 Solr 进行存储的对象数据
在存储 Java 对象之前,例子程序首先需要将 Java 对象变换为 Solr 可以接受的 XML 格式的 Document。前面已经提到,因为 Solrj 无法为我们处理 URL 信息(因为它不了解例子程序是如何设计 URL 的格式的),所以例子程序对这个处理过程进行了定制,变换后的 XML 格式的 Solr 的 Document 对象数据如下:
清单 4. Blogger 对象的数据格式(Blogger 的名字是 bob)
1
2
3
4
5
6
7
8
9
10
11
<doc>
<field name="url">org.apache.solr.blogsample.Blogger/bob</field>
    <field name="resource_type">org.apache.solr.blogsample.Blogger</field>
    <field name="name">bob</field>
    <field name="password">111</field>
    <field name="email">bob@gmail.com</field>
    <field name="gender">male</field>
    <field name="phone">111-111-11</field>
    <field name="homepage">http://www.app.com</field>
    <field name="articles">[org.apache.solr.blogsample.Article/0]</field>
</doc>




表 1. Blogger 对象的 Document 模型No.Field Name描述 1  url 存储系统使用的属性,用于唯一标识一个文档的属性,url 的格式参考前面的说明, Blogger 对象的 url 表示它是一个基础对象、且它的 name=bob。 2  resource_type 资源的类型,类型的名字在系统中是唯一的,在使用 Java 语言开发的应用中,资源类型显然设定为类名很方便。 3  name  Blogger 的名字 4  password  Blogger 的密码 5  email  Blogger 的电子邮件地址 6  gender  Blogger 的性别 7  phone  Blogger 电话号码 8  homepage  Blogger 个人主页 9  articles  Blogger 发表的所有 Article 的集合,articles 是一个包含其他对象的 List。同 JSON 的格式类似,List 类型的属性使用“[”和“]”标识开始和结束,List 元素之间使用“,”进行分割。
上述的属性中,url 是系统必须的属性,而 resource_type 属性是存储用于进行对象类型跟踪和创建的 Java 对象类型信息。其他的属性是对象本身的属性。您可能奇怪 Blogger bob 的 URL 信息中已经包含了 Java 对象的类型信息为什么这里还需要存储,这是因为只有基础资源的 URL 中包含了基础资源的类型信息,附属资源的 URL 没有包含附属资源的类型信息——它包含的是附属资源附属的基础资源的信息。
返回列表