Gerald,

I wonder if you tried to approach BlockJoin for your problem? Can you
afford less frequent updates?


On Wed, Nov 7, 2012 at 5:40 PM, Gerald Blanck <gerald.bla...@barometerit.com
> wrote:

> Thank you Erick for your reply.  I understand that search is not an RDBMS.
>  Yes, we do have a huge combinatorial explosion if we de-normalize and
> duplicate data.  In fact, I believe our use case is exactly what the Solr
> developers were trying to solve with the addition of the Join query.  And
> while the example I gave illustrates the problem we are solving with the
> Join functionality, it is simplistic in nature compared to what we have in
> actuality.
>
> Am still looking for an answer here if someone can shed some light.
>  Thanks.
>
>
> On Sat, Nov 3, 2012 at 9:38 PM, Erick Erickson <erickerick...@gmail.com
> >wrote:
>
> > I'm going to go a bit sideways on you, partly because I can't answer the
> > question <G>...
> >
> > But, every time I see someone doing what looks like substituting "core"
> for
> > "table" and
> > then trying to use Solr like a DB, I get on my soap-box and preach......
> >
> > In this case, consider de-normalizing your DB so you can ask the query in
> > terms
> > of search rather than joins. e.g.
> >
> > Make each document a combination of the author and the book, with an
> > additional
> > field "author_has_written_a_bestseller". Now your query becomes a really
> > simple
> > search, "author:name AND author_has_written_a_bestseller:true". True,
> this
> > kind
> > of approach isn't as flexible as an RDBMS, but it's a _search_ rather
> than
> > a query.
> > Yes, it replicates data, but unless you have a huge combinatorial
> > explosion, that's
> > not a problem.
> >
> > And the join functionality isn't called "pseudo" for nothing. It was
> > written for a specific
> > use-case. It is often expensive, especially when the field being joined
> has
> > many unique
> > values.
> >
> > FWIW,
> > Erick
> >
> >
> > On Fri, Nov 2, 2012 at 11:32 AM, Gerald Blanck <
> > gerald.bla...@barometerit.com> wrote:
> >
> > > At a high level, I have a need to be able to execute a query that joins
> > > across cores, and that query during its joining may join back to the
> > > originating core.
> > >
> > > Example:
> > > Find all Books written by an Author who has written a best selling
> Book.
> > >
> > > In Solr query syntax
> > > A) against the book core - bestseller:true
> > > B) against the author core - {!join fromIndex=book from=id
> > > to=bookid}bestseller:true
> > > C) against the book core - {!join fromIndex=author from=id
> > > to=authorid}{!join fromIndex=book from=id to=bookid}bestseller:true
> > >
> > > A - returns results
> > > B - returns results
> > > C - does not return results
> > >
> > > Given that A and C use the same core, I started looking for join code
> > that
> > > compares the originating core to the fromIndex and found this
> > > in JoinQParserPlugin (line #159).
> > >
> > >         if (info.getReq().getCore() == fromCore) {
> > >
> > >           // if this is the same core, use the searcher passed in...
> > > otherwise we could be warming and
> > >
> > >           // get an older searcher from the core.
> > >
> > >           fromSearcher = searcher;
> > >
> > >         } else {
> > >
> > >           // This could block if there is a static warming query with a
> > > join in it, and if useColdSearcher is true.
> > >
> > >           // Deadlock could result if two cores both had
> useColdSearcher
> > > and had joins that used eachother.
> > >
> > >           // This would be very predictable though (should happen every
> > > time if misconfigured)
> > >
> > >           fromRef = fromCore.getSearcher(false, true, null);
> > >
> > >
> > >           // be careful not to do anything with this searcher that
> > requires
> > > the thread local
> > >
> > >           // SolrRequestInfo in a manner that requires the core in the
> > > request to match
> > >
> > >           fromSearcher = fromRef.get();
> > >
> > >         }
> > >
> > > I found that if I were to modify the above code so that it always
> follows
> > > the logic in the else block, I get the results I expect.
> > >
> > > Can someone explain to me why the code is written as it is?  And if we
> > were
> > > to run with only the else block being executed, what type of adverse
> > > impacts we might have?
> > >
> > > Does anyone have other ideas on how to solve this issue?
> > >
> > > Thanks in advance.
> > > -Gerald
> > >
> >
>
>
>
> --
>
> *Gerald Blanck*
>
> baro*m*eter*IT*
>
> 1331 Tyler Street NE, Suite 100
> Minneapolis, MN 55413
>
>
> 612.208.2802
>
> gerald.bla...@barometerit.com
>



-- 
Sincerely yours
Mikhail Khludnev
Principal Engineer,
Grid Dynamics

<http://www.griddynamics.com>
 <mkhlud...@griddynamics.com>

Reply via email to