有没有办法在solr中合并两个查询?

时间:2011-10-05 16:54:00

标签: lucene solr nested-queries

在我的项目中,我们使用solr索引许多不同类型的文档,例如Books和Persons,带有一些常见字段(如名称)和一些特定于类型的字段(如类别或组人员)属于)。

我们希望执行可以查找书籍和人员的查询,并为每种文档类型应用一些过滤器。类似的东西:

  • 在名称和/或内容中找到所有带有“Jean”的书籍和人员
  • 但只有“小说”和“幻想”类别的书籍
  • 并且只有来自“pangolin”组的人员
  • 按分数排序的所有内容

一种非常简单的方法是:

q = name:jean content:jean
&
fq= 
    (type:book AND category:(fiction fantasy)) 
    OR 
    (type:person AND group:pangolin)

但是,当fq被缓存时,我更喜欢让我更简单,更可重用fq的东西,如:

  • fq=type:book
  • fq=type:person
  • fq=category(fiction fantasy)
  • fq=group:pangolin

有没有办法告诉solr合并或组合多个查询?像'{1}}一样'分组'的东西。

我读了一些关于fq的嵌套查询,但是关于它的文档很少,这让我觉得它不是我正在寻找的解决方案。

3 个答案:

答案 0 :(得分:3)

正如Geert-Jan在他的回答中提到的那样,在OR之间fq之间的可能性是一个solr ask功能,但现在支持很少:https://issues.apache.org/jira/browse/SOLR-1223

所以我设法以一种简单的方式模拟我想要的东西:

  • 对于文档类型可以拥有的每个字段,我们必须每次定义一个值(因此,如果在我自己的示例中,Books可以没有类别,那么在索引时我们仍然必须定义类似category=noCategoryCode
  • 在多个类型的查询中对其中一个字段使用过滤器时,我们会在过滤器中添加一个不存在的条件,因此fq=category:fiction变为fq=category:fiction (*:* AND -category:*)

通过这种方式,所有其他类型(如Person)将通过此过滤器,并且过滤器非常原子并经常使用 - 因此缓存仍然有用。

所以,我的完整例子变成了:

q = name:jean content:jean
&
fq= type:(book person)
&
fq= category:(fiction fantasy) (*:* AND -category:*)
&
fq= group:(pangolin) (*:* AND -group:*)

仍然等不及要修补SOLR-1223:)

答案 1 :(得分:0)

您可以同时应用多个过滤器查询

q=name:jean content:jean&fq=type:book&fq=type:person&fq=category(fiction fantasy)&fq=group:pangolin

答案 2 :(得分:0)

也许我不理解您的问题,但查询和过滤器之间的唯一区别是过滤器是缓存的。如果您不关心缓存,只需修改他们的查询:

real query +((type:book category:fiction) (type:person group:pangolin))