我试图在solr 5.5中实现搜索,这需要在子文档字段上进行分面。我意识到扁平化数据结构是solr搜索的理想解决方案,但不幸的是,由于搜索的业务需求,我需要维护各个字段之间的关系(因此是子文档)。
我正在尝试使用 BlockJoinFacetComponent 来分析子文档字段,并且我能够使用基本示例获得所有工作并获得我期望的计数,没有问题。我面临的问题是 BlockJoinFacetComponent 需要 ToParentQuery ,而我无法弄清楚如何将其与原始搜索查询相结合,仍然可以获得方面结果。< / p>
进一步解释:
我基本上遵循这个例子:http://www.slideshare.net/lucidworks/faceting-with-lucene-block-join-query-oleg-savrasov
在该示例中,用户最初搜索“着装”,然后显示小平面以按大小,颜色过滤。 “大小”和“颜色”是子字段,示例中使用 BlockJoinFacetComponent 按大小和颜色进行构面,并检索预期的计数。
在该示例中,用于检索所述方面的查询(幻灯片22)是:
q= {!parent which="scope:product"} COLOR: Blue
child.facet.field = SIZE
哪个工作正常。我不理解的是,在这个例子中,我们现在已经失去了对“着装”的原始搜索。所以我的问题基本上是如何将我的原始搜索(着装)与 ToParentQuery 结合起来?我已经尝试了所有我能想到的结合查询的东西,但我总是得到同样的例外:
"Block join faceting is allowed with ToParentBlockJoinQuery only".
我甚至已经下载了solr源代码并连接了一个远程调试器,其中抛出此错误以尝试调试它,但我仍然无法弄明白。无论我做什么,似乎除非 ToParentBlockJoinQuery 是查询中的唯一内容, BlockJoinFacetComponent 将拒绝它。考虑使用您现在丢失的用户最初搜索的组件,这似乎很奇怪。
答案 0 :(得分:0)
经过进一步调试后,问题源于BlockJoinFacetComponent似乎无法分离查询的ToParentBlockJoinQuery部分,如果您使用的是标准解析器以外的查询解析器(我使用的是edismax)。
例如,使用标准查询解析器,这可以工作:
"original query" + _query_:"{!parent which="scope:product"} COLOR: Blue"
child.facet.field = SIZE
如果使用dismax或edismax查询解析器运行此相同查询,则会收到错误:
"Block join faceting is allowed with ToParentBlockJoinQuery only".
由于我依赖于edismax查询解析器,因此这对我来说是个显示器。但是,通过使用JSON Facet API,我能够实现我想要的结果:http://yonik.com/solr-nested-objects/#faceting