我正在使用Solr使用SQL DIH索引存储在DBMS中的数据集。桌面上的一个使用n对n的关系。仅仅为了简单起见(我的应用程序比这复杂得多)这里是应用程序的一个示例:一个人有一个名称,并且它有一个关联的0..n角色(一个角色由一个role_name字符串描述)。
Table Person:
- id: int
- Name: string
Table roles
- id: int
- role_name: string
Table association
- id_person: int
- id_role: int
两个人可以被描述为:
id=1, name=John Doe, roles=[programmer, father, soccer player]
id=2, name= Eric Smith, roles=[]
这是我想用solr实现的目标。
我希望使用solr可以实现这一点(我使用的是6.4版本,但我可以轻松升级到最新版本6.5)。有没有人可以解释如何做或指向正确的信息/教程?
由于
UMG
答案 0 :(得分:0)
是可以在Solr。
我认为一个人没有多少角色 您可以创建如下所示的solr模式:
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
<field name="name" type="string" indexed="false" stored="true"/>
<field name="roles" type="strings" indexed="true" stored="true"/>
<field name="cfname" type="text_general" indexed="true" stored="false" multiValued="false"/>
<copyField source="name" dest="cfname"/>
这里的角色是一个多值字段。
现在您可以使用人名来查询:q=cfname:John
http://solr_node:8983/solr/collection_name/select?q=cfname%3AJohn
所有角色的列表,每个角色都包含整个数据集中的出现次数:q=*:*
,facet=true
,facet.field=roles
和rows=0
http://solr_node:8983/solr/collection_name/select?q=*%3A*&rows=0&facet=true&facet.field=roles
答案 1 :(得分:0)
您需要考虑的一些棘手的事情:
您将角色定义为多值
<field name="roles" type="string" indexed="true" stored="true" multiValued="true"/>
在DIH设置中,为了获得最佳性能,请执行此操作(这适用于mysql,根据需要对数据库进行修改):左连接,以便运行单个查询(比运行内部查询快得多)每个人),并使用sql GROUP BY和一个变换器来按摩角色到多值字段:
<entity name="person" pk="id" transformer="RegexTransformer" query="
SELECT p.id... GROUP_CONCAT(DISTINCT COALESCE(r.name,'') SEPARATOR '|') AS roles FROM person p LEFT JOIN association a ON p.id_person = a.id_role LEFT JOIN roles r ON a.id_role=r.id
WHERE ...
GROUP BY p.id, ...
">
<field column="roles" name="roles" splitBy="\|"/>
</entity>
这主要是为了获得最佳索引性能。将索引编入索引后,您要运行的查询非常基本。
上面的内容是手写的,没有经过测试,可能会有一些拼写错误,但希望你能得到它的要点。