Tamas,

This feels a bit like a "user favorites" problem.

I did a little searching and found this...  Don't know if it will help, but
when I'm looking for stuff like this I find it helps to try to come up with
generic or different descriptions of my problem and go search those as
well...

http://stackoverflow.com/questions/3931827/solr-merging-results-of-2-cores-into-only-those-results-that-have-a-matching-fie

On Fri, Apr 1, 2016 at 12:40 PM, John Bickerstaff <j...@johnbickerstaff.com>
wrote:

> Tamas,
>
> I'm brainstorming here - not being careful, just throwing out ideas...
>
> One thing that comes up is a separate document in SOLR - one doc for each
> list.
>
> If a user adds a doc to their list, that doc's id gets added to this other
> type of document...
>
> So, a document with the title "List 1" would have a multivalue field of
> ID's and the list order number like so:
>
> ID            List Position
> _________________
> doc1 ID :           1
> doc2 ID:            2
> doc3 ID:            3
>
> and so on...  The big problem I see with this is keeping it organized
> correctly.  More code would have to be written to handle this when the user
> does any kind of "crud" on the list...
>
> I'm pretty sure there's a way to write a query that uses that list to
> properly order the items returned by your primary search, although I
> haven't written such a query yet.
>
> If you have the luxury of NOT being in production yet with this system,
> I'd seriously consider pushing to keep application metadata OUT of your
> product information store.  This particular problem (of ordering the
> results based on arbitrary user choices) might be more easily handled via a
> separate step that queries a relational database to handle list order -
> once Solr gives you the documents that match the query and the user's list
> number...
>
> Even if you can't use another relational data store - keeping that
> metadata out of your individual product documents could be argued to be a
> good design idea...
>
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
> Here's an alternative brainstorm...
>
> Where does the user data live?  What about putting the information about
> the order of document ID's in the User's lists with the User?  Then you can
> get all documents that match the search terms and are on List X from Solr -
> and then sort them by ID based on the data associated with the User (a list
> of ID's, in order)
>
> There is even a way to write a plugin that will go after external data to
> help sort Solr documents, although I'm guessing you'd rather avoid that...
>
>
>
> On Fri, Apr 1, 2016 at 11:59 AM, John Bickerstaff <
> j...@johnbickerstaff.com> wrote:
>
>> OK - I get it.  List order is totally arbitrary and cannot be tied to an
>> hard data point.
>>
>> I'll have to think - Perhaps billnbell's solution will help, although I'm
>> not totally sure I understand that suggestion yet.
>>
>> At this point, you could get all the documents for List X that match the
>> search terms.  The next problem is sorting.  If you have the listpos field
>> too, you could use that, and some regex to find the proper order for these
>> documents before displaying them (in code I mean) but of course that means
>> you need some kind of "interceptor" to deal with this before the results
>> are displayed.
>>
>> If I had enough control to do this in code, behind the scenes, I'd grab
>> that second part of the listops field, put it into a variable on each
>> object and then sort by that.  Then I'd return the entire list to the UI.
>>
>> I understand that if you could get SOLR to do it all, that would be
>> ideal...  There is the possibility of writing some new code and plugging it
>> in to Solr, but I'm guessing you don't want to go that far..  As a final
>> step in the process, with custom code to consume the listpos entry, sorting
>> these would be fairly straightforward.  I'm not sure how you get away from
>> the lispos multivalue field however...
>>
>> I'll keep thinking...
>>
>> On Fri, Apr 1, 2016 at 11:26 AM, Tamás Barta <bartata...@gmail.com>
>> wrote:
>>
>>> So, the list order is determined by the user. The user creates a list,
>>> adds
>>> products to it and i have to display these list using filters and
>>> pagination.
>>>
>>> Let's assume there is list with 10000 products in it. In the website
>>> where
>>> i display the list only 50 products are displayed in a page. So if i
>>> could
>>> query solr to give me products from list X, ordered as user defined, but
>>> only products with some criteria (status, amount, ..) from offset and 50
>>> rows then it would be perfect and fast. If ordering would be outside of
>>> solr then i have to retrive almost every 10000 documents from solr (a bit
>>> less if filtered) to order them and display the page of 50 products.
>>> 2016. ápr. 1. 19:15 ezt írta ("John Bickerstaff" <
>>> j...@johnbickerstaff.com
>>> >):
>>>
>>> > Just to be clear - I don't mean who requests the list (application or
>>> user)
>>> > I mean what "rule" determines the ordering of the list?
>>> >
>>> > Or, is there even a rule of any kind?
>>> >
>>> > In other words, does a user arbitrarily decide that documentA,
>>> documentF,
>>> > and documentW should be on a list of their own?  For reasons known
>>> only to
>>> > the user?
>>> >
>>> > Or - does the ordering of the list depend on some piece of data?
>>> (like a
>>> > date, or a manufacturer, or a price range or any other piece of "hard"
>>> > data)
>>> >
>>> > ===
>>> >
>>> > To give an example from what I'm working on right now --
>>> >
>>> > My subject matter experts have given me a rule that says:
>>> >
>>> > *Documents of  content_type "bar" should come higher in the results
>>> than
>>> > documents of content_type "foo".*
>>> >
>>> > PsuedoCode: If (content_type == bar) then put this doc highest in the
>>> > results.  If (content_type == foo) put those docs after the "bar"
>>> > content_type docs.
>>> >
>>> >
>>> > This is an example of the ordering being tied to a specific piece of
>>> data
>>> > which I can manipulate in a "sub query"  (that's probably the wrong
>>> > term...)
>>> >
>>> >
>>> > This isn't exactly what you're doing, but it's close -- IF you have
>>> rules
>>> > you can express clearly in this way...
>>> >
>>> > ---
>>> >
>>> > Also, I'm confused a little by your statement that SOLR does the
>>> filtering
>>> > and pagination, thus you can't sort the documents after Solr returns
>>> > them...
>>> >
>>> > My mental model is that you ask Solr for all the documents that match a
>>> > certain criteria.  Solr returns that "set" of documents and then for
>>> your
>>> > list, you sort those document titles or ID's according to some rule --
>>> > possibly in the javascript on the web page...  But perhaps I'm not
>>> > understanding your situation well enough...
>>> >
>>> > Oh - are you perhaps saying that your ONLY criteria for getting these
>>> > documents is the list number?  That would make sense, although there
>>> may
>>> > still be room for sorting based on some kind of logic / data point
>>> outside
>>> > of SOlR.  You could get all the documents associated to list #4, and
>>> then
>>> > sort them based on some hard data point they all contain.  At the very
>>> > least, your listpos "array" becomes simpler...
>>> >
>>> > What does your query currently look like?
>>> >
>>> > On Fri, Apr 1, 2016 at 10:51 AM, Tamás Barta <bartata...@gmail.com>
>>> wrote:
>>> >
>>> > > Some of the lists are created by users and some are generated by
>>> > > applications, it doesn't matter.
>>> > >
>>> > > It would be fine to solve it in Solr because Solr does the work of
>>> > > filtering and pagination. If sorting were done outside than I would
>>> have
>>> > to
>>> > > read every document from Solr to sort them. It is not an option, I
>>> have
>>> > to
>>> > > query onle one page.
>>> > >
>>> > > I don't understand how to solve it using subqueries.
>>> > > 2016. ápr. 1. 18:42 ezt írta ("John Bickerstaff" <
>>> > j...@johnbickerstaff.com
>>> > > >):
>>> > >
>>> > > > Specifically, what drives the position in the list?  Is it
>>> arbitrary or
>>> > > is
>>> > > > it driven by some piece of data?
>>> > > >
>>> > > > If data-driven - code could do the sorting based on that data...
>>> > > separate
>>> > > > from SOLR...
>>> > > >
>>> > > > Alternatively, if the data point exists in SOLR, a "sub-query"
>>> might be
>>> > > > used to get the right sort order on the items returned by the
>>> "main"
>>> > > > search...  Possibly without having to resort to the clunky-feeling
>>> > > listpos
>>> > > > multivalued field...
>>> > > >
>>> > > > On Fri, Apr 1, 2016 at 10:32 AM, Tamás Barta <bartata...@gmail.com
>>> >
>>> > > wrote:
>>> > > >
>>> > > > > For example I have to display sellable products which are in
>>> list X
>>> > in
>>> > > > the
>>> > > > > correct order.
>>> > > > >
>>> > > > > If I add a "status" and "list" (multivalued) fields to every
>>> document
>>> > > > > (products), then I can execute a query: status:sellable AND
>>> list:X,
>>> > > > where X
>>> > > > > is the ID of the list. The list field contains IDs of the list in
>>> > which
>>> > > > the
>>> > > > > product is in.
>>> > > > >
>>> > > > > The problem is that I can't sort the result. A product has
>>> different
>>> > > > index
>>> > > > > for every list.
>>> > > > >
>>> > > > > Is it clear now?
>>> > > > >
>>> > > > > Earlier I added a "listpos" field with multivalue content, for
>>> > example:
>>> > > > >
>>> > > > > 1:23
>>> > > > > 2:4
>>> > > > >
>>> > > > > Which means that this product is in position 23 in list 1 and it
>>> is
>>> > in
>>> > > > > position 4 in list 2. After that I created a custom comparator
>>> which
>>> > > > parses
>>> > > > > field values to get index for the specified list and sorts by
>>> that
>>> > > index.
>>> > > > >
>>> > > > > But I didn't like that solution much. I wish there would be a
>>> better
>>> > > > > solution. In SolrJ unfortunately I can't find an API to set
>>> custom
>>> > > > > comparator like I did in Lucene. So I don't know how to solve
>>> this
>>> > > > problem
>>> > > > > in Solr.
>>> > > > >
>>> > > > > Thanks,
>>> > > > > Tamás
>>> > > > > 2016. ápr. 1. 17:25 ezt írta ("Alessandro Benedetti" <
>>> > > > > abenede...@apache.org
>>> > > > > >):
>>> > > > >
>>> > > > > > I think this is a classic XY Problem , you are trying to solve
>>> X
>>> > with
>>> > > > Y ,
>>> > > > > > and you are asking us about Y .
>>> > > > > > Could you describe us what is your X problem ? What are you
>>> trying
>>> > to
>>> > > > do
>>> > > > > > with this ordered lists ?
>>> > > > > >
>>> > > > > > If not I would add a field to the product called :
>>> > > > > > list_position ( or a similar name) of type geo point (x,y) .
>>> > > > > > X could be your list ID
>>> > > > > > Y the position.
>>> > > > > > Then you can play with spatial search, to get what you want.
>>> > > > > >
>>> > > > > > But again, let's try to solve X.
>>> > > > > >
>>> > > > > > Cheers
>>> > > > > >
>>> > > > >
>>> > > >
>>> > >
>>> >
>>>
>>
>>
>

Reply via email to