5

LinkedInタイプの検索用にSolr4.0とElasticSearch0.20.5を評価していて、ネストされたドキュメントを使用したelasticsearchで簡単に実現できるユーザープロファイルの正規化データを保存する方法を考えていました。

たとえば、
Person Json

{
    first_name: abc,
    last_name: xyz,
    school: [{
      name: some school,
      degree: x-Degree,
      startDate:12-02-2009
   },
   {
      name: some school2,
      degree: x-Degree-2,
      startDate:12-02-2012
   }
   ]

}

LinkedIn検索と同様に、ユーザーの学校名、学位、現在の勉強を検索したいのですが、

Solrでインデックスを作成して検索するための最良の方法は何ですか?

4

3 に答える 3

1

残念ながら、Solrはelasticsearchほどネストされたドキュメントを定義することはできません。

Solrの場合、答えはmultiValued、フラット化されたドキュメント内の目的の情報を模倣するフィールドを使用することです。個人的には、特にグループ化された詳細(オブジェクト)が分離されている可能性があるため、これは非常に限定的であると思いますが、これはSolrの方法です。arunの参照リンクで示唆されているように、動的フィールドを使用してこれを修正できます(たとえば、school_name_1とリンクさschool_degree_1school_name_2school_degree_2います)が、elasticsearchの柔軟性に比べてはるかに面倒です。

ドキュメントがXMLの場合は、を使用しXPathEntityProcessorて自動的にフラット化できます。おそらくもっと残念なことに、私は類似のアクションを実行するJSONプロセッサを知りません。

次のようなスキーマが必要になります。

<field name="first_name" indexed="true" />
<field name="last_name" indexed="true" />
<field name="school_name" multiValued="true" indexed="true" />
<field name="school_degree" multiValued="true" indexed="true" />
<field name="school_start_date" multiValued="true" indexed="true" />

終了日を忘れないでください。また、学生は複数の学位を取得できることを検討することもできますが、これは、学校を2倍にするか、同じ開始年の学位を配列にすることで解決できます。

于 2013-03-04T04:39:02.797 に答える
1

私はあなたがあなたが望むものを正確に達成できると確信しています。多くのフィールドタイプとコミュニティプラグインがあります。唯一の問題は、適切なドキュメントを見つけるのが難しいことです。

明らかに、@pickypgが提案するようなmultiValuedフィールドを選択できます。この問題は、1つのクエリでschool_nameとschool_degreeで検索しようとすると発生します。結果は正しくありません。

少し異なる問題に対して私がしていることは、PointTypeクラスを使用することです。

<fieldType name="range" class="solr.PointType" dimension="1" subFieldType="double" />

<field name="cat_lr" type="range" indexed="true" stored="true" multiValued="true"/>

これにより、ドキュメントごとに複数の範囲を設定できます。私はこれらを次のように挿入します:

cat_lr=2,5

そして私はこのようにそれらを探します:

+cat_lr:[1 TO 10]

それがあなたの問題に役立つことを願っています。ドキュメントで頑張ってください。

于 2013-03-10T09:47:53.730 に答える
0

インデックス付けは、 multiValuedフィールドを使用して実行する必要があります

<field name="first_name" indexed="true" />
<field name="last_name" indexed="true" />
<field name="school_name" multiValued="true" indexed="true" />
<field name="school_degree" multiValued="true" indexed="true" />
<field name="school_start_date" multiValued="true" indexed="true" />


検索、school_nameのような単一のフィールドの検索は、通常のフィールド検索と同じように簡単ですが、複数のネストされたフィールドの検索は、異なる方法で処理する必要があります。

SpanTermQueriesをFiledMaskingSpanQueryと組み合わせて、SpanNearQuery内に配置すると、学校の位置の交点を検索し、指定されたアイテム(school_name:some schoolおよびschool_degree:x-Degree)を含むPersonを適切に見つけることができます。

SpanNearQuery(
    SpanTermQuery("school_name", "some school”),
    FieldMaskingSpanQuery(
               SpanTermQuery("school_degree", "x-Degree"),
               “school_name”
    ), -1, false
)

参照

于 2013-03-11T06:25:47.293 に答える