Lucene 有没有办法在solr中合并两个查询?
在我的项目中,我们使用solr索引许多不同类型的文档,通过示例书籍和人员,使用一些公共字段(如名称)和一些特定类型的字段(如类别或人员所属的组) 我们想做的查询,可以找到书和人,与每个文件类型应用一些过滤器。比如:Lucene 有没有办法在solr中合并两个查询?,lucene,solr,nested-queries,Lucene,Solr,Nested Queries,在我的项目中,我们使用solr索引许多不同类型的文档,通过示例书籍和人员,使用一些公共字段(如名称)和一些特定类型的字段(如类别或人员所属的组) 我们想做的查询,可以找到书和人,与每个文件类型应用一些过滤器。比如: 查找名称和/或内容中带有“Jean”的所有书籍和人员 但只有“小说”和“幻想”类的书 只有“穿山甲”组的人 一切都按分数排序 一个非常简单的方法是: q = name:jean content:jean & fq= (type:book AND category
- 查找名称和/或内容中带有“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=组:穿山甲
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:你试过了吗?通常情况下,查询的速度不会比过滤器慢很多。事实上,我目前没有数据来做这样的压力测试,但我会尽快:)