Solr DIH具有多值字段和刻面

时间:2017-04-10 13:36:37

标签: solr facet dih

我正在使用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实现的目标。

  1. 使用DIH导入数据(可能使用嵌套的SQL查询?)
  2. 查询并显示包含所有人员信息+人员角色的数据
  3. 能够使用给定角色进行查询,例如告诉我所有角色=程序员的人?
  4. 设置分面,创建所有角色的列表,每个角色都包含整个数据集中的出现次数
  5. 我希望使用solr可以实现这一点(我使用的是6.4版本,但我可以轻松升级到最新版本6.5)。有没有人可以解释如何做或指向正确的信息/教程?

    由于

    UMG

2 个答案:

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

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

答案 1 :(得分:0)

您需要考虑的一些棘手的事情:

  1. 您将角色定义为多值

     <field name="roles" type="string" indexed="true" stored="true" multiValued="true"/>
    
  2. 在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>
    
  3. 这主要是为了获得最佳索引性能。将索引编入索引后,您要运行的查询非常基本。

    上面的内容是手写的,没有经过测试,可能会有一些拼写错误,但希望你能得到它的要点。