2017-04-10 90 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。索引完成後,要運行的查詢就非常基本。

上面的配置文件是手寫的,沒有經過測試,可能會有一些拼寫錯誤等,但希望您能掌握它的要點。