连接查询和Solr-DIH中的嵌入实体之间有什么区别?

连接查询和Solr-DIH中的嵌入实体之间有什么区别?,solr,dataimporthandler,dih,Solr,Dataimporthandler,Dih,我试图使用Solr的数据导入处理程序跨多个表索引数据。建议使用嵌入式实体链接多个表,如下所示: <document> <entity name="item" pk="id" query="SELECT * FROM item"> <entity name="member" pk="memberid" query="SELECT * FROM member WHERE memberid='${item.memberid}'>

我试图使用Solr的数据导入处理程序跨多个表索引数据。建议使用嵌入式实体链接多个表,如下所示:

<document>
    <entity name="item" pk="id" query="SELECT * FROM item">
        <entity name="member" pk="memberid" query="SELECT * FROM member WHERE memberid='${item.memberid}'>
        </entity>
    </entity>
</document>


我遇到的几件事:

  • 如果您有一对一映射,您可以使用联接,这样您就可以通过一个查询本身获得所有字段
  • 如果根目录有多条记录,则将使用可能创建多值字段的子实体
  • 子实体为每个记录触发一个查询,因此性能较慢

也希望听取其他用户的意见。

如果要优化性能,可以使用第二个选择创建物化视图。这意味着您可以直接从物化视图导入DIH(无需在DIH中创建任何内部联接或子实体,这意味着导入速度要快得多,并且源数据库不会“过热”),如果您愿意,您可以创建一个cronjob,每天或根据需要快速刷新物化视图。如果您使用的是MySQL,您可以查看有关物化视图的详细信息。
希望这会有所帮助。

我认为重要的一点是:对于一对一表,使用join可能会更快,但会导致为一对多或多对多关系索引多个文档。
<document>
    <entity name="item" pk="id" query="SELECT * FROM item INNER JOIN member ON item.memberid=member.memberid">
    </entity>
</document>