Solr的:过滤在OR查询匹配的数量为多值字段(Solr: Filtering on the num

2019-09-02 13:22发布

考虑下面的例子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 

所有三个文件将被退回,因为他们每个人都有指定的朋友的至少一个。

不过,我想设置多少朋友匹配的最小(和最大)阈值。 例如,只返回至少有2个,但不超过3指定文件的朋友。

这样的查询将只返回第三文件(赫敏),因为她的指定的4位朋友3,而第(哈利·波特)匹配所有4和第2(罗恩)只有1相匹配。

这是可能的Solr的查询?

Answer 1:

你要使用的功能查询 , termfreq ,和count(又名“朋友”你的情况)匹配的项数。 你可以总结的结果,那么只有你的阈值之内恢复文件,使用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管理面板供您参考:



Answer 2:

我能看到的最简单的方法是只添加一个“nbOfFriends”字段和源或在UpdateProcessor填充它。

如果你不希望添加这个额外的领域,你可能看加盟 ,但我不知道这是否可以查询在加入儿童的数量,你应该检查。



文章来源: Solr: Filtering on the number of matches in an OR query to a multivalued field
标签: solr