Hi everyone,

I have what's probably a loaded question about how Solr parses queries.

Basically, the client wants to restructure the way they handle permissions. Instead of assigning specific permissions ids (as we've done up until this point), they want to structure permissions by adding a particular filter query depending on the products that the user has purchased. In principle, it could save a lot of reindexing time because when products change, it simply changes the filter queries, instead of requiring reindexing of large portions of the documents in the index.

However, I'm hitting a snag... Basically, here is the way we'd like to structure the queries:

Documents can have zero or more tags in a particular field assigned to them. All permissions are essentially tied to the tags in this field. For each product a user has purchased, there are a certain number of tags associated with it. Users should be able to see all documents which match any of these tags, as well as all documents which don't match *any* tag associated with a product. Basically, this means that users can see any documents which match their specific products, as well as any documents which aren't bound to any product in particular (documents which are essentially open to anyone).

Let's say that the following tags represent all the restricted tags in the system:

tag1
tag2
tag3
tag4

The current user is allowed access to documents with tags tag1 and tag2, and documents which have none of these tags.

So, by my own logic, I'd make the query:

((my_field:tag1) OR (my_field:tag2) OR (-my_field:tag1 AND - my_field:tag2 AND -my_field:tag3 AND -my_field:tag4))

Keep in mind that "my_field" can have other tags beyond tags 1-4 which essentially have no impact on permissions.

Obviously, I'm writing here because this query doesn't work... at all. I see according to the wikis that, apparently, - or "NOT" *excludes* all documents which have the tag in question. So this is just not the right syntax for what I'm doing.

What I can't seem to find is a syntax which says "return all documents which don't match this query", or perhaps more importantly, "return all documents which either match query1 or don't match query 2". I tried using the "_query_" syntax but no luck there either.

Am I mistaken, or is there simply no way in SOLR to return the documents which didn't match the specified query?

If not, I fear there's very little potential for optimization here.... Reindexing all affected documents for a product every time a product's parameters change is becoming very cumbersome - it can take hours. We'd really like to find a way to avoid having to do that. If anyone can help figure out a way to actually do this I'd be very grateful.

Thanks!

--
Steve

Reply via email to