【问题标题】:SOLR, if function in sort failedSOLR,如果排序中的函数失败
【发布时间】:2014-11-05 18:10:44
【问题描述】:

尝试按 if 函数排序:if(true,due_register,0)

出现错误:

2014-11-05 22:03:21,208 [ERROR] <qtp101478235-372>@SolrException.java:120 null:java.lang.UnsupportedOperationException
    at org.apache.lucene.queries.function.FunctionValues.doubleVal(FunctionValues.java:47)
    at org.apache.lucene.queries.function.valuesource.IfFunction$1.doubleVal(IfFunction.java:83)
    at org.apache.lucene.queries.function.ValueSource$ValueSourceComparator.copy(ValueSource.java:153)
    at org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.collect(TopFieldCollector.java:86)
    at org.apache.lucene.search.Scorer.score(Scorer.java:65)
    at org.apache.lucene.search.ConstantScoreQuery$ConstantScorer.score(ConstantScoreQuery.java:256)
    at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:621)
    at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:297)
    at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1606)
    at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1394)
    at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:475)
    at org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:459)
    at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:214)
    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1916)
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:780)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:427)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:217)
    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:744)

如果我在 fl 参数中包含相同的子句: fl=if(true,due_register,0),due_register,exists(due_register)

我收到关注结果:

"docs": [
   {
    "due_register": "1414713600000",
    "if( true,due_register,0)": "1414713600000",
    "exists(due_register)": true
  },
  {
    "due_register": "",
    "exists(due_register)": true
  },
  {
    "due_register": "",
    "exists(due_register)": true
  },
  {
    "due_register": "",
    "exists(due_register)": true
  }
]

if(true,due_register,0) 为空时完全错过,但同时直接字段和存在函数工作正常

【问题讨论】:

  • 是的,看起来排序不适用于返回字符串的函数查询。
  • 顺便说一句,我不确定您实际上要做什么。如果您提到这一点,也许有人可以告诉您另一种解决方案。
  • 看来您是对的,迁移此字段以长期解决问题。

标签: solr solr4


【解决方案1】:

正如@arun 所说,

看起来排序不适用于返回字符串的函数查询。

所以我将字段迁移到长类型而不是它的工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2021-12-17
    相关资源
    最近更新 更多