solr中一对多,多对多关系

先看下官方文档的例子:

假设有如下表结构:

example-schema.png

data-config.xml:一对多,多对多的关系写法如下:


 
 
  1. <dataConfig>
  2. <dataSource driver= "org.hsqldb.jdbcDriver" url= "jdbc:hsqldb:/temp/example/ex" user= "sa" />
  3. <document name= "products">
  4. <entity name= "item" query= "select * from item">
  5. <field column= "ID" name= "id" />
  6. <field column= "NAME" name= "name" />
  7. <field column= "MANU" name= "manu" />
  8. <field column= "WEIGHT" name= "weight" />
  9. <field column= "PRICE" name= "price" />
  10. <field column= "POPULARITY" name= "popularity" />
  11. <field column= "INSTOCK" name= "inStock" />
  12. <field column= "INCLUDES" name= "includes" />
  13. <entity name= "feature" query= "select description from feature where item_id='${item.ID}'">
  14. <field name= "features" column= "description" />
  15. </entity>
  16. <entity name= "item_category" query= "select CATEGORY_ID from item_category where item_id='${item.ID}'">
  17. <entity name= "category" query= "select description from category where id = '${item_category.CATEGORY_ID}'">
  18. <field column= "description" name= "description" />
  19. </entity>
  20. </entity>
  21. </entity>
  22. </document>
  23. </dataConfig>

一对多写法:


 
 
  1. <entity name= "feature" query= "select description from feature where item_id='${item.id}'">
  2. <field name= "feature" column= "description" />
  3. </entity>

多对多写法:


 
 
  1. <entity name= "item_category" query= "select category_id from item_category where item_id='${item.id}'">
  2. <entity name= "category" query= "select description from category where id = '${item_category.category_id}'">
  3. <field column= "description" name= "description" />
  4. </entity>
  5. </entity>

本人使用的是以上的写法,api中也给出了另一种写法,但自己没有测试过:


 
 
  1. <dataConfig>
  2. <dataSource driver= "org.hsqldb.jdbcDriver" url= "jdbc:hsqldb:/temp/example/ex" user= "sa" />
  3. <document>
  4. <entity name= "item" query= "select * from item">
  5. <entity name= "feature" query= "select description as features from feature where item_id='${item.ID}'"/>
  6. <entity name= "item_category" query= "select CATEGORY_ID from item_category where item_id='${item.ID}'">
  7. <entity name= "category" query= "select description as cat from category where id = '${item_category.CATEGORY_ID}'"/>
  8. </entity>
  9. </entity>
  10. </document>
  11. </dataConfig>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

刚开始配置完成后,得出的结果始终是一对一:

如上图:假如:item表和item_category表是一对多,但我这边始终得出的结果是一对一,如:name和description不是一个name对应多个description(实际数据库的结果是一对多的)有点不解;

其实,除了data-config.xml文件需要配置外,还有个重要的文件,managed-schema文件(本人使用的是solr7,老版本里是schema.xml,操作都一样,只要名称不同)也需要修改:

添加索引字段:


 
 
  1. <field name= "id" type= "string" indexed= "true" stored= "true" />
  2. <field name= "name" type= "string" indexed= "true" stored= "true" />
  3. <field name= "manu" type= "string" indexed= "true" stored= "true" />
  4. <field name= "weight" type= "string" indexed= "true" stored= "true" />
  5. <field name= "price" type= "string" indexed= "true" stored= "true" />
  6. <field name= "popularity" type= "string" indexed= "true" stored= "true" />
  7. <field name= "inStock" type= "string" indexed= "true" stored= "true" />
  8. <field name= "includes" type= "string" indexed= "true" stored= "true" />
  9. <field name= "features" type= "string" indexed= "true" stored= "true" />
  10. <field name= "cat" type= "string" indexed= "true" stored= "true" />

这个是最开始的配置,达不到理想的结果:

由于本人刚学习solr,不太熟悉,网上百度了一翻,才发现还有个:multiValued(多值的)属性,想要的是一个name对应多个description,那么就应该把description配置成多值的,所以添加multiValued属性,修改managed-schema文件:


 
 
  1. <field name= "id" type= "string" indexed= "true" stored= "true" />
  2. <field name= "name" type= "string" indexed= "true" stored= "true" />
  3. <field name= "manu" type= "string" indexed= "true" stored= "true" />
  4. <field name= "weight" type= "string" indexed= "true" stored= "true" />
  5. <field name= "price" type= "string" indexed= "true" stored= "true" />
  6. <field name= "popularity" type= "string" indexed= "true" stored= "true" />
  7. <field name= "inStock" type= "string" indexed= "true" stored= "true" />
  8. <field name= "includes" type= "string" indexed= "true" stored= "true" />
  9. <field name= "features" type= "string" indexed= "true" stored= "true" multiValued= "true"/>
  10. <field name= "cat" type= "string" indexed= "true" stored= "true" multiValued= "true"/>

再次导入数据,得到想要的结果了

到此完成:

但是在使用中又遇到了一个问题,比如solr查询记录有5条,使用Java查询:


 
 
  1. HttpSolrClient solrServer = createSolrServer( "goods");
  2. SolrQuery query = new SolrQuery();
  3. query.set( "q", "*:*");
  4. // 设置分页参数
  5. query.setStart( 1);
  6. // 每一页多少值
  7. query.setRows( 10);
  8. QueryResponse response = solrServer.query(query);
  9. SolrDocumentList solrDocumentList = response.getResults();

每页10条,从第一页开始,一切看着没问题,可是结果只有4条,solr查询少了一条记录,百思不得其解...

原来数据库默认分页limit(mysql)是1,但solr是0,所以需要把query.setStart(1)--修改为-->query.setStart(0),从第一页开始,才是正确的!!!

solr继续学习中....

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值