在数据索引的时候会碰到一个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 = “,”‘做分割把我带到坑了.虽然逻辑上没有问题.但是却不符合常规的思维方式,只能说是奇淫技巧.后面好好检查了两个配置.重新做索引得到了想要的结果.