solr中数据导入中多值处理

在数据索引的时候会碰到一个field有多个值的情况,在field的属性中提供了一个multiValued="true"的属性.可以做多值索引.

做多值索引可以使用copyField或者是直接使用dataimport.这两种情况可以解决遇到的大多数多值索引的需求.

###使用copyField做多值索引

设置一个field的multiValued值为true. 并设置copyField值到这个field.这个field将以多值来存储.schema.xml文件配置如下

1
2
3
4
<field name="text" type="string" indexed="true" stored="true" multiValued="true" />
<copyField source="filename" dest="text"/>
<copyField source="ext" dest="text"/>

索引后搜索结果如下,其中text的值为filename和ext两个值组成的多值索引.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"docs": [
{
"ext": "docx",
"text": [
"docx",
"??????????100?????.docx"
],
"filename": "??????????100?????.docx",
"count": 1,
"id": "12",
"url": "file/61777234d3d949f2a95b61035088fdd4.docx",
"_version_": 1488260579550298000
}
]

##dataimport多值索引

dataimport方式是很实用的多值索引方式,比如主附表需要索引,主表一条记录对应了附表多条记录.就可以使用这种方式来索引.

我有file和filelist两个表,其中filelist的fid是file的外键.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `file` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`filename` varchar(255) DEFAULT NULL,
`ext` varchar(20) DEFAULT NULL,
`count` int(11) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`is_exc` int(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE `filelist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fid` int(11) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`pagenum` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


schema.xml配置中添加一条urllist的field,multiValued=”true”.

1
2
<field name="urllist" type="string" indexed="true" stored="true"  multiValued="true" />

data-config.xml中配置urllist的实体,将查询的url绑定到urllist.

1
2
3
4
5
<entity name ="filelist"
query="select fid ,url from filelist where fid ='${file.id}' order by pagenum asc ">
<field column ="url" name="urllist" />
</entity>

最后查询出来的urllist的结果为sql查询的多值.

1
2
3
4
5
6
7
"urllist": [
"179/daf/5205d53046f6089c50b2d43509775f/0.jpg",
"179/daf/5205d53046f6089c50b2d43509775f/1.jpg",
"179/daf/5205d53046f6089c50b2d43509775f/2.jpg",
"179/daf/5205d53046f6089c50b2d43509775f/3.jpg"
],

###全部配置

#####schema.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

<field name="filename" type="text_question" indexed="true" stored="true" />
<field name="ext" type="string" indexed="true" stored="true" />
<field name="count" type="int" indexed="true" stored="true" />
<field name="url" type="string" indexed="true" stored="true" />
<field name="urllist" type="string" indexed="true" stored="true" multiValued="true" />
<field name="text" type="string" indexed="true" stored="true" multiValued="true" />

<uniqueKey>id</uniqueKey>
<copyField source="filename" dest="text"/>
<copyField source="ext" dest="text"/>


#####data-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <document name="filetest" dataSource="test">

<entity name='file'
query="select id,filename,ext,count,url from file "
>
<field column="id" name="id" />
<field column="filename" name="filename" />
<field column="ext" name="ext" />
<field column="count" name="count" />
<field column="url" name="url" />
<entity name ="filelist"
query="select fid ,url from filelist where fid ='${file.id}' order by pagenum asc ">
<field column ="url" name="urllist" />
</entity>
</entity>

</document>

###后记
在配置多值索引的时候,由于配置的时候有个地方配置错了,索引文件出不来,在stackoverflow上查询到使用group_concat做查询连接,然后使用’splitBy = “,”‘做分割把我带到坑了.虽然逻辑上没有问题.但是却不符合常规的思维方式,只能说是奇淫技巧.后面好好检查了两个配置.重新做索引得到了想要的结果.

作者

张巍

发布于

2014-12-23

更新于

2014-12-23

许可协议

评论