7

次の solr ドキュメントの例があるとします。

<doc>
  <field name="guid">1</field>
  <field name="name">Harry Potter</field>
  <field name="friends">ron</field>
  <field name="friends">hermione</field>
  <field name="friends">ginny</field>
  <field name="friends">dumbledore</field>
</doc>
<doc>
  <field name="guid">2</field>
  <field name="name">Ron Weasley</field>
  <field name="friends">harry</field>
  <field name="friends">hermione</field>
  <field name="friends">lavender</field>
</doc>
<doc>
  <field name="guid">3</field>
  <field name="name">Hermione Granger</field>
  <field name="friends">harry</field>
  <field name="friends">ron</field>
  <field name="friends">ginny</field>
  <field name="friends">dumbledore</field>
</doc>

および次のクエリ (またはフィルター クエリ):

friends:ron OR friends:hermione OR friends:ginny OR friends:dumbledore 

3 つのドキュメントはすべて、指定された友人の少なくとも 1 人を持っているため、返されます。

ただし、一致する友達の数に最小 (および最大) のしきい値を設定したいと思います。たとえば、指定されたフレンドが 2 人以上 3 人以下のドキュメントのみを返します。

このようなクエリでは、指定された 4 人の友人のうち 3 人が指定されているため、3 番目のドキュメント (ハーマイオニー グレンジャー) のみが返されますが、最初のドキュメント (ハリー ポッター) は 4 人すべてに一致し、2 番目のドキュメント (ロン ウィーズリー) は 1 つだけに一致します。

これは Solr クエリで可能ですか?

4

2 に答える 2

10

関数 query、を使用し、termfreq一致した用語 (この場合は「友達」) の数をカウントします。frange次のように を使用して、結果を合計し、しきい値内のドキュメントのみを返すことができます。

{!frange l=2 u=3}sum(termfreq(friends,'ron'),termfreq(friends,'hermione'),termfreq(friends,'ginny'),termfreq(friends,'dumbledore'))

termfreq(...)は、見つかった友人ごとに返され、それらの合計がしきい値 (ステートメント1の冒頭で指定した下限と上限) に対してテストされます。!frange

これをq:フィールドまたはfq:フィールドに配置できます。参考までに、Solr 管理パネルには次のように表示されます。

ここに画像の説明を入力

于 2013-05-14T16:23:22.113 に答える
0

私が確認できる最も簡単な方法は、「nbOfFriends」フィールドを追加して、ソースまたは UpdateProcessor に入力することです。

この追加フィールドを追加したくない場合は、Joinsを確認できますが、結合内の子の数を照会できるかどうかはわかりません。確認する必要があります。

于 2013-05-13T07:14:47.080 に答える