You'll need to be a bit careful using joins, as the performance hit
can be significant if you have lots of cross-referencing to do, which
I believe you would given your scenario.

Your table could be setup to use the username as the key (for fast
lookup), then map these to your own data class or collection or
similar to hold your other information: products, expiry etc.
By using your own data class, it's then easy to extend it later if you
want to add additional parameters. (for example: HashMap<String,
MyDataClass>)

When a search comes in, the user is looked up to retrieve the data
class, then its contents (as defined by you) is examined and the query
is processed/filtered appropriately.

You'll need a bootstrap mechanism for populating the list in the first
place. One thing worth looking at is lazy loading - i.e. the first
time a user does a search (you lookup the user in the table, and it
isn't there), you load the data class (maybe from your DB, a file, or
index), then ad it to the table. This is good if you have 10's of
thousands or millions of users, but only a handful are actually
searching, some perhaps very rarely.

If you do have millions of users, and your data class has heavy
requirements (e.g. many thousands of products + info etc.), you might
want to 'time-out' in-memory table entries, if the table gets really
huge - it depends on the usage of your system. (you can run a
synchronized cleanup thread to do this if you deemed it necessary).


On Fri, Jun 17, 2011 at 6:06 AM, Sujatha Arun <suja.a...@gmail.com> wrote:
> Alexey,
>
> Do you mean that we  have current Index as it is and have a separate core
> which  has only the user-id ,product-id relation and at while querying ,do a
> join between the two cores based on the user-id.
>
>
> This would involve us to Index/delete the product  as and when the user
> subscription for a product changes ,This would involve some amount of
> latency if the Indexing (we have a queue system for Indexing across the
> various instances) or deletion is delayed
>
> IF we want to go ahead with this solution ,We currently are using solr 1.3
> , so  is this functionality available as a patch for solr 1.3?Would it be
> possible to  do with a separate Index  instead of a core ,then I can create
> only one  Index common for all our instances and then use this instance to
> do the join.
>
> Thanks
> Sujatha
>
> On Thu, Jun 16, 2011 at 9:27 PM, Alexey Serba <ase...@gmail.com> wrote:
>
>> > So a search for a product once the user logs in and searches for only the
>> > products that he has access to Will translate to something like this .
>> ,the
>> > product ids are obtained form the db  for a particular user and can run
>> > into  n  number.
>> >
>> > <search term> &fq=product_id(100 10001  ......n number)
>> >
>> > but we are currently running into too many Boolean expansion error .We
>> are
>> > not able to tie the user also into roles as each user is mainly any one
>> who
>> > comes to site and purchases a product .
>>
>> I'm wondering if new trunk Solr join functionality can help here.
>>
>> * http://wiki.apache.org/solr/Join
>>
>> In theory you can index your products (product_id, ...) and
>> user_id-product many-to-many relation (user_product_id, user_id) into
>> signle/different cores and then do join, like
>> f=search terms&fq={!join from=product_id to=user_product_id}user_id:10101
>>
>> But I haven't tried that, so I'm just speculating.
>>
>

Reply via email to