Solr按函数查询的值排序不起作用

Solr按函数查询的值排序不起作用,solr,lucene,solrj,solr4,solrcloud,Solr,Lucene,Solrj,Solr4,Solrcloud,我正在开发一个功能,它依赖于对函数查询的值进行排序 功能查询如下: 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类型的动态字段)存在,那么排序基于字段的值

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

功能查询如下:

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类型的动态字段)存在,那么排序基于字段的值,否则排序基于“theme”的值,这也是一个TextField(但它不是动态字段)

但是当我运行这个程序时,它会失败,出现以下异常。 我尝试了带有整数值的“if”函数,效果很好。 我只是想知道你能否帮我弄清楚为什么上面的函数查询失败?我怎样才能让它工作

我使用的Solr版本是4.6.1

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

我正在看IfFunction$1.doubleVal(IfFunction.java:83)行,我认为这个例子是关于函数查询限制的。它可以对数字字段进行操作,如下图所示:

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

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

  • 如果存在
    f1\u t
    字段,则从
    user\u h1\u t
    字段
  • 主题
    字段,否则

按文本字段排序将不会像您预期的那样工作,除非该字段被关键字标记化。如果可能,请使用StrField进行排序。我可以将它们更改为StrField,但是否可以使用StrField实现此排序功能?我试过斯特菲尔德,得到了同样的例外,你的问题和那个问题有关。目前在lucene中构建排序的方式,不允许在搜索时使用双精度以外的任何东西。这就是为什么排序函数
if(exists(firstname)、firstname、lastname)asc
无法工作,并且solr在
FunctionValues#doubleVal(int)
方法处返回
UnsupportedOperationException