2017-04-10 10 views
0

私はSolrを使用して、SQL DIHを使用してDBMSに格納されたデータセットのインデックスを作成しています。テーブル上の1つは、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 

二人のように説明することができます:私はSolrのでは達成したいものをここで

id=1, name=John Doe, roles=[programmer, father, soccer player] 
id=2, name= Eric Smith, roles=[] 

  1. インポートDIHとのデータ(ネストされたSQLクエリを使用している可能性?)
  2. 照会し、すべての人の情報とデータ+人の役割
  3. を提示し、与えられた役割を使用して照会することができ、例えば役割=プログラマーの人すべてを教えてください。私はこれがSolrの持つ可能であることを期待全体のデータセット

での出現数とそれぞれが(私はバージョン6.4を使用していますが、私はできる、すべてのロールのリストを作成するファセットを、設定し

  • 最新の6.5に簡単にアップグレードできます)。誰かがそれを行う方法や適切な情報/チュートリアルを指摘することができますか?

    おかげ

    UMG

  • +0

    両方の行IDが同じですか? –

    +0

    申し訳ありませんが、それはタイプミスです、私は今修正しよう! – ugomaria

    答えて

    0

    はいそれは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"/> 
    

    役割は複数値フィールドです:

    は、私は一人の人間が、あなたが1を下回るようなあなたのSolrのスキーマを作成することができます役割
    の膨大な数を持っていないと仮定します。

    今、あなたは人の名前で問い合わせることができます:q=cfname:John

    http://solr_node:8983/solr/collection_name/select?q=cfname%3AJohn 
    

    そして、すべてのロールのリストを、それぞれ全体のデータセットでの出現数と1: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. あなたが最適なパフォーマンスのために、DIHのセットアップで

      <field name="roles" type="string" indexed="true" stored="true" multiValued="true"/> 
      
    2. を多値として、役割を定義する(これはあなたのDBのために必要に応じて変更しない、mysqlのためのものです)このようにそれを実行しますので、あなたが実行して参加し、左単一のクエリ(はるかに高速一人につき、内側のクエリを実行するよりも)、およびSQLのGROUP BY、および多値フィールドに役割をマッサージするために、変圧器を使用します。これは、最適なインデックスPERFのために主にある

      <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> 
      

    を。インデックスを作成したら、実行するクエリはかなり基本的です。

    上記のconfは手書きであり、テストされていません。いくつかのタイプミスなどがありますが、その要点を得ることを望みます。

    関連する問題