arun
arun

Reputation: 11023

Solr boost query syntax

The Solr function query documentation says:

exists(query({!v='year:2012'})) will return true for docs with year=2012

I have a document like:

{
  id: 1,
  user_type: ADMIN,
  like_score: 1
}

id, user_type and like_score are all indexed and stored files, with id being int, user_type being string and like_score being int.

I issue a query like this:

q={!boost b=if(true,10,1)}id:1&rows=1&fl=*,score

which works. But this query does not work:

q={!boost b=if(exists(query({!v='user_type:ADMIN'})),10,1)}id:1&rows=1&fl=*,score

It gives an error like this:

"error":{
  "msg":"org.apache.solr.search.SyntaxError: Cannot parse ')),5,10)}id:1': Encountered \" \")\" \") \"\" at line 1, column 0.\nWas expecting one of:\n    <NOT> ...\n    \"+\" ...\n    \"-\" ...\n    <BAREOPER> ...\n    \"(\" ...\n    \"*\" ...\n    <QUOTED> ...\n    <TERM> ...\n    <PREFIXTERM> ...\n    <WILDTERM> ...\n    <REGEXPTERM> ...\n    \"[\" ...\n    \"{\" ...\n    <LPARAMS> ...\n    <NUMBER> ...\n    <TERM> ...\n    \"*\" ...\n    ",
  "code":400
}

How do I fix the query?

This syntax works:

q={!func}if(exists(query({!v='user_type:ADMIN'})),5,10)&rows=1&fl=*,score

but it doesn't do what I want to the score.

Upvotes: 1

Views: 2159

Answers (1)

arun
arun

Reputation: 11023

Asked solr-user group. Here is answer from Chris Hostetter:

The problem is the way you are trying to nest queries inside of each other w/o any sort of quoting -- the parser has no indication that the "b" param is if(exists(query({!v='user_type:ADMIN'})),10,1) it thinks it's "if(exists(query({!v='user_type:ADMIN'" and the rest is confusing it.

If you quote the "b" param to the boost parser, then it should work...

http://localhost:8983/solr/select?q={!boost b="if(exists(query({!v='foo_s:ADMIN'})),10,1)"}id:1

...or if you could use variable derefrencing, either of these should work...

http://localhost:8983/solr/select?q={!boost b=$b}id:1&b=if(exists(query({!v='foo_s:ADMIN'})),10,1)

http://localhost:8983/solr/select?q={!boost b=if(exists(query($nestedq)),10,1)}id:1&nestedq=foo_s:ADMIN

-Hoss

Upvotes: 4

Related Questions