[
https://issues.apache.org/jira/browse/SOLR-9510?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15593500#comment-15593500
]
Yonik Seeley commented on SOLR-9510:
------------------------------------
OK, here's the way I'm currently thinking about things (hopefully it will add
further clarity rather than more confusion ;-)
First, let's leave aside "exclusions" and just look at domain changes in the
JSON Facet API for the moment.
Example:
I find books I've reviewed highly (search for reviews and use block join to get
to parent documents):
{code}
q={!parent which=type_s:book}user_s:yonik AND rating_i:5
{code}
Now I want to facet on *my* review dates. Since the root domain consists of
books, we'll need to map back to reviews (children):
{code}
json.facet={
review_dates : {
type: range,
field: review_dt,
domain: { blockChild : "type_s:book" },
// additional params start, end, etc.
}
}
{code}
Now there's a problem... when I map back to children, it maps to *all* of the
children (reviews) for each book, when I really want just those reviews that
originally mached user_s:yonik AND rating_i:5
I could perhaps hack it in with multiple levels of query facets (the first to
switch the domain, and the second to filter again) but that seems really
unfriendly.
What we really need is a way to specify additional filters for *any* facet.
Proposal:
{code}
json.facet={
review_dates : {
type: range,
field: review_dt,
domain: { blockChild : "type_s:book" },
filter : [ "user_s:yonik AND rating_i:5" ], // a list of filters... if
there is a domain change, they will be applied *after*
// additional params start, end, etc.
}
}
{code}
I started with this because we can't really exclude filters from child facets
when we don't currently apply any at all!
I'll split my further thoughts into separate messages to try and keep things
manageable.
> child level facet exclusions
> ----------------------------
>
> Key: SOLR-9510
> URL: https://issues.apache.org/jira/browse/SOLR-9510
> Project: Solr
> Issue Type: Improvement
> Security Level: Public(Default Security Level. Issues are Public)
> Components: Facet Module, faceting, query parsers
> Reporter: Mikhail Khludnev
>
> h2. Challenge
> * Since SOLR-5743 achieved block join child level facets with counts roll-up
> to parents, there is a demand for filter exclusions.
> h2. Context
> * Then, it's worth to consider JSON Facets as an engine for this
> functionality rather than support a separate component.
> * During a discussion in SOLR-8998 [a solution for block join with child
> level
> exclusion|https://issues.apache.org/jira/browse/SOLR-8998?focusedCommentId=15487095&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15487095]
> has been found.
>
> h2. Proposal
> It's proposed to provide a bit of syntax sugar to make it user friendly,
> believe it or not.
> h2. List of improvements
> * introducing a local parameter {{filters}} for {{\{!parent}} query parser
> referring to _multiple_ filters queries via parameter name: {{\{!parent
> filters=$child.fq ..}..&child.fq=color:Red&child.fq=size:XL}}
> these _filters_ are intersected with a child query supplied as a subordinate
> clause.
> * introducing {{\{!filters params=$child.fq excludeTags=color
> v=$subq}&subq=text:word&child.fq={!tag=color}color:Red&child.fq=size:XL}} it
> intersects a subordinate clause (here it's {{subq}} param, and the trick is
> to refer to the same query from {{\{!parent}}}), with multiple filters
> supplied via parameter name {{params=$child.fq}}, it also supports
> {{excludeTags}}.
> h2. Notes
> Regarding the latter parser, the alternative approach might be to move into
> {{domain:\{..}}} instruction of json facet. From the implementation
> perspective, it's desired to optimize with bitset processing, however I
> suppose it's might be deferred until some initial level of maturity.
> h2. Example
> {code}
> q={!parent which=type_s:book filters=$child.fq
> v=$childquery}&childquery=comment_t:good&child.fq={!tag=author}author_s:yonik&child.fq={!tag=stars}stars_i:(5
> 3)&wt=json&indent=on&json.facet={
> comments_for_author:{
> type:query,
> q:"{!filters params=$child.fq excludeTags=author v=$childquery}",
> "//note":"author filter is excluded",
> domain:{
> blockChildren:"type_s:book",
> "//":"applying filters here might be more promising"
> }, facet:{
> authors:{
> type:terms,
> field:author_s,
> facet: {
> in_books: "unique(_root_)"
> }
> }
> }
> } ,
> comments_for_stars:{
> type:query,
> q:"{!filters params=$child.fq excludeTags=stars v=$childquery}",
> "//note":"stars_i filter is excluded",
> domain:{
> blockChildren:"type_s:book"
> }, facet:{
> stars:{
> type:terms,
> field:stars_i,
> facet: {
> in_books: "unique(_root_)"
> }
> }
> }
> }
> }
> {code}
> Votes? Opinions?
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]