2017-04-10 117 views
0

我使用Solr的索引使用SQL DIH存储在DBMS的数据集。一个在表中使用N对N的关系。只是为了简单起见,(我的应用程序比这个复杂得多)这里是应用程序的一个例子:一个人有一个名字和它相关联的0到n的角色(一个角色由ROLE_NAME字符串描述)。Solr的DIH多值字段和刻面

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什么。

  1. 导入与DIH的数据(可使用嵌套的SQL查询?)
  2. 查询,并与所有的人信息+人的角色
  3. 能够使用给定的角色来查询呈现数据,例如告诉我所有与角色=程序员的人?
  4. 设置刻面,创建所有角色的列表,每一个与出现在整个数据集

我希望这是可能的使用Solr(我使用6.4版本的数字,但我可以轻松升级到最新的6.5)。是否有人可以解释如何,或点做正确的信息/教程?

感谢

UMG

+0

两行id是否相同? –

+0

抱歉,这是一个错字,我现在要修复它! – ugomaria

回答

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=truefacet.field=rolesrows=0

http://solr_node:8983/solr/collection_name/select?q=*%3A*&rows=0&facet=true&facet.field=roles 
0

一些棘手的事情,你需要考虑到:

  1. 定义角色多值

    <field name="roles" type="string" indexed="true" stored="true" multiValued="true"/> 
    
  2. 在DIH设置

    ,以获得最佳性能,像这样做(这是MySQL,根据需要为您DB做修改):左加入让你运行单个查询(比跑步每人内查询更快),并使用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> 
    

这主要是为优化索引PERF。索引完成后,要运行的查询就非常基本。

上面的配置文件是手写的,没有经过测试,可能会有一些拼写错误等,但希望您能掌握它的要点。