2

在我的项目中,我们使用 solr 来索引许多不同类型的文档,例如 Books 和 Persons,其中包含一些常见字段(如名称)和一些特定类型的字段(如类别或人们所属的组) .

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

  • 查找名称和/或内容中带有“Jean”的所有书籍和人物
  • 但仅限于“小说”和“奇幻”类别的书籍
  • 并且只有“穿山甲”组的人
  • 一切按分数排序

一个非常简单的方法是:

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 合并或组合许多查询?像“分组”fq在一起的东西。

我用 阅读了一些关于嵌套查询的信息_query_,但是关于它的极少文档让我认为这不是我正在寻找的解决方案。

4

3 回答 3

3

正如 Geert-Jan 在他的回答中提到的那样,在OR两者之间做的可能性fq是一个 solr 询问功能,但现在几乎没有支持: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 被修补了 :)

于 2011-10-07T07:13:01.137 回答
0

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

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

于 2011-10-05T17:48:14.950 回答
0

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

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

于 2011-10-06T18:19:26.407 回答