根据函数query的值进行Solr排序不起作用



我正在开发一个依赖于对函数查询值进行排序的功能。

功能查询如下:

http://localhost:8983/solr/collection/select?q=*:*&sort=if(exists(f1_t), f1_t, theme)+ASC&wt=json&indent=true

分拣功能为"if(exists(f1_t), f1_t, theme) ASC">

所以基本上我要做的是,如果字段"f1_t"(它是一个类型为TextField的动态字段(存在,那么排序是基于字段的值,否则排序是基于"主题"的值,它也是一个TextField(但它不是一个动态字段(

但当我运行此程序时,它会失败,出现以下异常。我尝试了使用整数值的"if"函数,它运行良好。我只是想知道你能不能帮我弄清楚为什么上面的函数查询失败了?我该怎么做?

我使用的Solr版本是4.6.1

"trace": "java.lang.UnsupportedOperationExceptionntat
org.apache.lucene.queries.function.FunctionValues.doubleVal(FunctionValues.java:47)ntat 
org.apache.lucene.queries.function.valuesource.IfFunction$1.doubleVal(IfFunction.java:83)ntat 
org.apache.lucene.queries.function.ValueSource$ValueSourceComparator.copy(ValueSource.java:152)ntat 
org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.collect(TopFieldCollector.java:86)ntat 
org.apache.lucene.search.Scorer.score(Scorer.java:65)ntat 
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:621)ntat 
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:297)ntat 
org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1529)ntat 
org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1395)ntat 
org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:474)ntat 
org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:438)ntat 
org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:208)ntat 
org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)ntat org.apache.solr.core.SolrCore.execute(SolrCore.java:1859)ntat 
org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:723)ntat 
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:419)ntat 
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:203)ntat 
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)ntat 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)ntat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)ntat 
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)ntat 
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)ntat 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)ntat 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)ntat 
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)ntat 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)ntat 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)ntat 
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)ntat 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)ntat 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)ntat org.eclipse.jetty.server.Server.handle(Server.java:368)ntat 
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)ntat 
org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)ntat 
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:942)ntat 
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1004)ntat 
org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)ntat 
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)ntat 
org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)ntat 
org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)ntat 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)ntat 
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)ntat java.lang.Thread.run(Thread.java:662)n",
    "code": 500 

我正在查看IfFunction$1.doubleVal(IfFunction.java:83(行,我认为这是关于函数查询限制的情况。它可以对数字字段进行操作,正如人们在函数查询wiki中看到的那样:

函数查询使您能够使用一个或多个数字字段的实际值。

由于您事先知道要使用的字段,因此可以在索引时解决这个特定的问题。换句话说,创建代理排序字段,该字段将取值:

  • 如果存在f1_t字段,则从user_h1_t字段
  • 否则从theme字段

最新更新