Board logo

标题: 利用开源的 Apache Solr 搜索引擎构建 RESTful 基础存储服务(6) [打印本页]

作者: look_w    时间: 2018-9-14 16:52     标题: 利用开源的 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 没有包含附属资源的类型信息——它包含的是附属资源附属的基础资源的信息。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0