当前位置: 代码迷 >> Java相关 >> 二、关联表创建索引
  详细解决方案

二、关联表创建索引

热度:43   发布时间:2016-04-22 19:33:55.0
SOLR对多个(关联)表创建索引

  又两天没写博客,关于SOLR的东西,写了一周了还没写完我也是醉了,毕竟会的东西真不多,周四晚上加班没写,周五晚上公司同事聚会也没写,今天在家,还是把最后的一点写完吧,我会的剩下的也就是一个对多个表创建索引了,表可以是关联的,也可以是不关联的,下面开始。

一、无关联多表创建索引

1.1数据库准备

  首先在数据库创建一张表,本来有一个tuser表了,我又创建了一个role表,就两三个字段,没什么特殊的,然后在里面随便添加几条数据即可,看一下数据库:

1.2data-config.xml

  数据库创建完成之后就是修改data-config.xml文件了,因为数据库跟solr之间的关联主要就是建立在这个文件上面的,所以接下来就是修改该文件了,我已经写好了,下面直接贴出来看一下即可:

在<document></document>标签中间在添加一个<entity>标签即可,然后把对应的字段添加到中间就可以了,但是要注意几点:

注意:

  1.<entity>标签的name属性,该属性用来区分不同的entity,所以不能和其他的entity标签的name相同。

  2.pk属性,数据库中表的主键是什么,那么pk属性的值就是什么,不能改变。

  3.第三点很重要,首先,我们再schema.xml中配置有这样的属性,这个配置代表着solr创建索引时对于id的值具有唯一性,就像数据库表的主键一样不能重复,在数据库中主键重复会报错,但是solr创建索引时,如果id的值重复,那么后面创建的索引会覆盖前面创建的索引,我们平时创建表时主键id一般都是int类型自增的,这样的话两个表的id值很可能相同,那么就会发生索引覆盖的情况。那么怎么解决呢?一个办法是主键id使用uuid的方式,这样肯定不会重复的,也就不会发生索引覆盖的情况了。但是我们大多数情况下还是使用自增的方式作为id,我在网上查了下,有人直接在schema.xml中去掉uniqueKey属性,也有在两张表中新创建一个字段,将这个字段设置为uniqueKey属性的值,以此来达到索引不覆盖的目的,但是这两种方式我都没有尝试过,大家有兴趣的可以自己去尝试一下。

  4.在该文件中可以配置多个dataSource,也就是说如果你两张表不在一个数据库,那么你也可以同时对这两张表创建索引,只需要将表和数据源对应上就可以了,方式如下:

1.3.修改schema.xml

  将表中需要创建索引的字段添加到该文件中即可,注意,两个表中相同的字段就可以不用再添加了,比如,两个表中都有id,那么id字段只写一次就可以了。

  按照上面的方式配置完成之后,启动tomcat,访问localhost:8080/solr页面,重新创建索引,创建完的索引如下所示:

{  "responseHeader": {    "status": 0,    "QTime": 1,    "params": {      "indent": "true",      "q": "*:*",      "_": "1445664391222",      "wt": "json"    }  },  "response": {    "numFound": 8,    "start": 0,    "docs": [      {        "userAge": 33,        "userAddress": "中国",        "isdelete": 0,        "updateTime": "2015-10-19T12:41:09Z",        "id": 43,        "userName": "刘德华",        "_version_": 1515741213715595300      },      {        "userAge": 44,        "userAddress": "中国",        "isdelete": 0,        "updateTime": "2015-10-19T12:41:26Z",        "id": 44,        "userName": "周星驰",        "_version_": 1515741214565990400      },      {        "userAge": 55,        "userAddress": "中国",        "isdelete": 0,        "updateTime": "2015-10-19T12:41:44Z",        "id": 45,        "userName": "刘若英",        "_version_": 1515741214565990400      },      {        "userAge": 123,        "userAddress": "123",        "isdelete": 0,        "updateTime": "2015-10-19T12:51:30Z",        "id": 46,        "userName": "周润发",        "_version_": 1515741214565990400      },      {        "userAge": 456,        "userAddress": "456",        "isdelete": 0,        "updateTime": "2015-10-19T12:51:40Z",        "id": 47,        "userName": "梁朝伟",        "_version_": 1515741214565990400      },      {        "id": 1,        "RoleDiscrib": "我是老大",        "RoleName": "管理员",        "_version_": 1515741214598496300      },      {        "id": 2,        "RoleDiscrib": "我是老大1",        "RoleName": "管理员1",        "_version_": 1515741214598496300      },      {        "id": 3,        "RoleDiscrib": "我是老大12",        "RoleName": "管理员12",        "_version_": 1515741214598496300      }    ]  }}
View Code

  我数据库中两个表一共只有8条数据,创建的索引也是8条,关于id的事,只要两个表中的id不重复,那么就不会发生索引覆盖的事,所以我这里只是简单做一个例子,关于索引覆盖的事大家可以按照我上面说的几种方法操作就可以了,当然有更好的方法更好了。

 

二、关联表创建索引

 至于关联表创建索引和单表创建索引差不多,本来我是想单独创建几个表,然后再一点一点写出来,但是突然想起来前两天有个朋友给我评论说我写的东西完全看不明白,所以我想这次试试直接使用官方提供的例子来写,什么意思呢?就是把官方文档上的内容粘贴过来试试,其实官方文档写的更好。

  2.1.数据库配置

  

  2.2.data-congfig.xml配置

<dataConfig><dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" />    <document name="products">        <entity name="item" query="select * from item">            <field column="ID" name="id" />            <field column="NAME" name="name" />            <field column="MANU" name="manu" />            <field column="WEIGHT" name="weight" />            <field column="PRICE" name="price" />            <field column="POPULARITY" name="popularity" />            <field column="INSTOCK" name="inStock" />            <field column="INCLUDES" name="includes" />            <entity name="feature" query="select description from feature where item_id='${item.ID}'">                <field name="features" column="description" />            </entity>            <entity name="item_category" query="select CATEGORY_ID from item_category where item_id='${item.ID}'">                <entity name="category" query="select description from category where id = '${item_category.CATEGORY_ID}'">                    <field column="description" name="cat" />                </entity>            </entity>        </entity>    </document></dataConfig>
View Code

除了上面那种方式,官方文档还给出了另外一种方式,但是这种方式我没用过,下面我把那种方式贴出来,也把官方文档的解释贴出来,大家可以自己看着使用吧,不过我还是喜欢使用上面的这种方式:

<dataConfig>    <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" />    <document>        <entity name="item" query="select * from item">            <entity name="feature" query="select description as features from feature where item_id='${item.ID}'"/>            <entity name="item_category" query="select CATEGORY_ID from item_category where item_id='${item.ID}'">                <entity name="category" query="select description as cat from category where id = '${item_category.CATEGORY_ID}'"/>            </entity>        </entity>    </document></dataConfig>
View Code

官方的解释是这样的:

In the above example, there are mappings of fields to Solr fields. It is possible to totally avoid the field entries in entities if the names of the fields are same (case does not matter) as those in Solr schema. You may need to add a field entry if any of the built-in Tranformers are used (see Transformer section)

 

  接下来还是修改schema.xml文档,把需要创建索引的字段放到该文件中即可。

 

  多表创建索引的方式我就介绍完了,虽然写的很粗糙,但是应该还有点用吧,更多的内容大家可以自己去查看官方文档的http://wiki.apache.org/solr/DataImportHandler这个地方,至于有人说都是英文看不懂,关于这个问题我想说的是其实我英文也是半吊子,但是借助一些翻译工具还是能看一点的,看的多了就看的懂了,不要怕看英文,坚持看下去总能看的懂的,就算你看不全懂,至少能明白大概说的什么意思就行啊,带蒙带猜的,这都不是事。

  另外关于solr的其他东西我就暂时不不写了,一方面是因为我研究这个时间也不长,有些东西我也不是太懂,目前只能算是刚刚入门吧,另一方面,本来要用solr的项目又说不用了,新开的项目也是比较紧急,所以关于solr的东西也只好暂时先放下了,以后再用到的时候再捡起来继续吧。恩,暂时就这样了。

 

 

 

 

 

  

  相关解决方案