Question

I'm trying to add a boolean calculated field to a Solr request which will be true if the id field of the document is in the specified list of ids.

I'm trying to do it this way

fl=*,score,myfield:if(or(not(sub(id,1)),not(sub(id,2)),not(sub(id,3))),true,false)

But getting

java.lang.UnsupportedOperationException
    at org.apache.lucene.queries.function.FunctionValues.floatVal(FunctionValues.java:44)
    at org.apache.solr.search.ValueSourceParser$17$1.func(ValueSourceParser.java:255)
    at org.apache.lucene.queries.function.valuesource.DualFloatFunction$1.floatVal(DualFloatFunction.java:61)
    at org.apache.lucene.queries.function.docvalues.FloatDocValues.intVal(FloatDocValues.java:51)
    at org.apache.lucene.queries.function.FunctionValues.boolVal(FunctionValues.java:52)
    at org.apache.solr.search.ValueSourceParser$68$1.func(ValueSourceParser.java:693)
    at org.apache.lucene.queries.function.valuesource.SimpleBoolFunction$1.boolVal(SimpleBoolFunction.java:53)
    at org.apache.solr.search.ValueSourceParser$70$1.func(ValueSourceParser.java:735)
    at org.apache.lucene.queries.function.valuesource.MultiBoolFunction$1.boolVal(MultiBoolFunction.java:56)
    at org.apache.lucene.queries.function.valuesource.IfFunction$1.objectVal(IfFunction.java:103)
    at org.apache.solr.response.transform.ValueSourceAugmenter.transform(ValueSourceAugmenter.java:99)
    at org.apache.solr.response.transform.DocTransformers.transform(DocTransformers.java:77)
    at org.apache.solr.response.TextResponseWriter.writeDocuments(TextResponseWriter.java:273)
    at org.apache.solr.response.TextResponseWriter.writeVal(TextResponseWriter.java:172)
    at org.apache.solr.response.JSONWriter.writeNamedListAsMapWithDups(JSONResponseWriter.java:183)
    at org.apache.solr.response.JSONWriter.writeNamedList(JSONResponseWriter.java:299)
    at org.apache.solr.response.JSONWriter.writeResponse(JSONResponseWriter.java:95)
    at org.apache.solr.response.JSONResponseWriter.write(JSONResponseWriter.java:60)
    at org.apache.solr.servlet.SolrDispatchFilter.writeResponse(SolrDispatchFilter.java:647)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:375)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:158)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:368)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
    at org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:942)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1004)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
    at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)
    at org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:724)

Have I taken an entirely wrong approach (besides that I can do this outside Solr) or if this is how one would do it what should I change to make it work?

Was it helpful?

Solution

this should work (use more or() to add more id values):

&fl=*,score,myfield:or(exists(query({!v='id:1'})),exists(query({!v='id:2'})))

what is failing for you is probably that id is not a numeric type in schema so you cannot use sub(). So you could still try your way but id should be tint type for instance.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top