2017-11-24 4 views
5

:フィールドID、ContactId、プロパティ稼働とIDの一意のキーを持つ文書とのSolr 6.6.2グループ化されたクエリ

A Solrのクラウドコレクション。

同じContactIdを持つ複数のドキュメントが存在する可能性があります。

各連絡文書には、1行のテキストを含むテキストフィールドプロパティがあります。プロパティフィールドは '、'で区切ってインデックス付けされています。プロパティ:グリーンヒット。例えば

+----+-----------+--------------+ 
| ID | ContactId | Properties | 
+----+-----------+--------------+ 
| 1 | C1  | Blue,Green | 
| 2 | C1  | Blue,Yellow | 
| 3 | C2  | Green,Yellow | 
+----+-----------+--------------+ 

は今、私はプロパティが「グリーン」、このクエリは、このContactIDのすべての文書上で一致することを許可されている「イエロー」を持っているすべてのContactIdsを見つける必要があります。結果はC1、C2の場合になります。

結果をグループ化しようとしましたが、グループ化された結果を照会できませんでした。

group=true&group.field=ContactId&group.query=(Green AND Yellow)&q=(Green OR Yellow) 

私は続くアイデアがグリーンOR group.field ContactId、その後でgroup.query緑と黄の条件でグループ化を行うよりもイエローのいずれかを持っているすべての文書を取得するためのクエリ(Q)でした。 しかし、それは成功しませんでした。 MySQLの一

はちょうど

group_concat(Properties) as grouped 

を行うと、その文字列上のようにします:

grouped LIKE '%Green%' AND grouped LIKE '%Yellow%' 

どのように私はSolrのインデックスにこのクエリを達成することができますか?

交差のSolrの例から派生し
intersect( 
    search(w3, q=Properties:("Green"), fl="ContactId", sort="ContactId asc"), 
    search(w3, q=Properties:("Yellow"), fl="ContactId", sort="ContactId asc"), 
    on="ContactId") 

は、これまでの重引用符でとせずに示唆されているようにしようとしました両方のプロパティが同じ文書内のどこ

intersect( 
    search(w3, q=Properties:("Green" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"), 
    search(w3, q=Properties:("Yellow" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"), 
    on="ContactId") 

しかし、まだ結果だけが出てくると同一のContactIdの複数のドキュメントに分割されているものではありません(その場合はC2のみですが、C1では使用できません)。

+0

既存のデータモデルで行う必要がありますか?インデックス時間の参加はあなたのためかどうかはできませんか? – Mysterion

+0

いいえ、私はそれを変更することはできません – gantners

答えて

1

あなたは(すなわち、1つのクエリは1がGreenと一致し、Yellowと一致する)Streaming Expressionを使用して、両方のクエリ間でドキュメントcontained in the intersectionをフェッチすることによってこれを行うことができます。

intersect(
    search(collection, q=Properties:Yellow, fl="ContactId", sort="ContactId asc"), 
    search(collection, q=Properties:Green, fl="ContactId", sort="ContactId asc"), 
    on="ContactId" 
) 

あなたはexprパラメータを通じてストリーミング表現を与えます要求ハンドラ/streamに送信します。あなたのコレクションのSolr管理インターフェースの "Stream"の下で直接テストすることもできます(expr=なし)。

これ以外にも、あなたのMySQLの例では、テキストがどこかに存在する要素が含まれているため、実際には同じことをしません。つまり、「ダークグリーン」は偽陽性です。

+0

私はそのアプローチを試みましたが、正しい結果を提供しません。このように、交点は、C1についてはDoc1、黄色についてはDoc2とは異なる返された文書に基づいて行われる。しかし、私は、返されたドキュメントのプロパティContactIDの代わりに、ドキュメントそのものを必要とします。 – gantners

+0

交点は、交点演算子の 'on'で与えられたフィールド上で実行する必要があります。このフィールドで並べ替えることが重要です。これは、どちらのストリームでも次のドキュメントに進むために交差演算子がどのように処理するのかを知るためです。これが失敗した例と、式の結果がありますか? – MatsLindh

+0

私も同様に思ったことがありますが、結果は異なっています。私はあなたのものだけでなく、例から派生したものを試しました。 – gantners

関連する問題