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

Lucene 有没有办法在solr中合并两个查询?,lucene,solr,nested-queries,Lucene,Solr,Nested Queries,在我的项目中,我们使用solr索引许多不同类型的文档,通过示例书籍和人员,使用一些公共字段(如名称)和一些特定类型的字段(如类别或人员所属的组) 我们想做的查询,可以找到书和人,与每个文件类型应用一些过滤器。比如: 查找名称和/或内容中带有“Jean”的所有书籍和人员 但只有“小说”和“幻想”类的书 只有“穿山甲”组的人 一切都按分数排序 一个非常简单的方法是: q = name:jean content:jean & fq= (type:book AND category

在我的项目中,我们使用solr索引许多不同类型的文档,通过示例书籍和人员,使用一些公共字段(如名称)和一些特定类型的字段(如类别或人员所属的组)

我们想做的查询,可以找到书和人,与每个文件类型应用一些过滤器。比如:

  • 查找名称和/或内容中带有“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=类别(幻想小说)
  • fq=组:穿山甲
有没有办法告诉solr合并或组合许多查询?类似于“分组”
fq
在一起


我读了一些关于使用
\u query\ucode>的嵌套查询的文章,但是关于它的文档很少,这让我觉得这不是我想要的解决方案。

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


q=name:jean-content:jean&fq=type:book&fq=type:person&fq=category(虚构幻想)&fq=group:pangolin

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


real query+((类型:图书类别:小说)(类型:人物组:穿山甲))

正如Geert Jan在他的回答中提到的,在
fq
之间执行
的可能性是一个solr-asking功能,但到目前为止支持很少:

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

  • 对于文档类型可以具有的每个字段,我们每次都必须定义一个值(因此,如果在我自己的示例书中没有类别,那么在索引时,我们仍然必须定义类似
    category=noCategoryCode
  • 在对多个类型的查询中对其中一个字段使用筛选器时,我们会在筛选器中添加一个不存在的条件,因此
    fq=category:fraction
    将变为
    fq=category:fraction(*:*和-category:*)
通过这种方式,所有其他类型(如Person)都将通过该过滤器,并且该过滤器非常原子,并且经常使用——因此缓存仍然很有用

因此,我的完整示例变成:

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

尽管如此,我还是迫不及待地想修补SOLR-1223:)

因为“book”和“person”是不相交的->fq=type:book&fq=type:person将返回0个结果。我必须同意@Geert Jan:我的全部问题是
fq=category:(幻想小说)
将删除所有可能的人,而
fq=group:pangolin
将扔掉所有的书。一种可能的方法是添加一个不存在的字段条件,类似于
fq=group:pangolin(-group:[*to*])
:它将包括“pangolin”组中的所有人,也包括没有字段组的所有文档(so书籍)。我只是希望有一个更好的方法,我很确定这是不可能的。每个筛选器查询(fq)都是独立计算的,并生成一个缓存的docset(docid的无序集)。Fq很有用(读取速度快),因为当指定其中的两个时,文档集会被感兴趣,这会快速截断搜索空间。换句话说:在逻辑上指定多个筛选器查询会导致“并”它们。遗憾的是,Solr FieldCollasing不支持在您将字段指定为group on(在您的示例中为“type”)后追加fq,而这几乎解决了这一问题。尽管如此,我还是希望这个链接可能会被证明是有用的,因为它是一种表示每种类型N个顶级文档的好方法。虽然我意识到这不是你在这里要求的100%。。我也很确定这是不可能的,但我希望我错过了一件事:)在查询中设置fq组将是一件非常酷的事情,比如
fq={group:a}…&fq={group:a}…&fq={group:B}
,所以solr将播放查询,然后用类似的内容进行过滤“A组的所有fq或B组的所有fq”,而不是其简单的“所有fq”“。好吧,我想我必须使用我在@Paige Cook answer中的评论中描述的非当前现场条件解决方案。无论如何,谢谢你的回答!啊。。虽然开发不是很热门……谢谢,但问题本质上是尝试一些关心缓存和性能的东西。@XavierPortebois:你试过了吗?通常情况下,查询的速度不会比过滤器慢很多。事实上,我目前没有数据来做这样的压力测试,但我会尽快:)