【发布时间】:2011-12-06 09:22:31
【问题描述】:
我在所有索引字段上都收到了这个奇怪的错误消息can not sort on multivalued field: fieldname。这是来自 solr 的完整错误消息
</head><body><h1>HTTP Status 400 - can not sort on multivalued field: price</h1><hr/><p><b>type</b> Status report</p><p><b>message</b>can not sort on multivalued field: price</p><p><b>description</b>The request sent by the client was syntactically incorrect (can not sort on multivalued field: price).</p><hr/><h3>GlassFish Server Open Source Edition 3.1</h3></body></html>
我确定我的索引字段没有设置multiValued=true
<field name="price" type="float" indexed="true" stored="true" multivalued="false" />
确保我添加了multiValued=false,但我仍然遇到同样的错误。
这是发送给 solr 的 URL 请求
http://localhost:8080/apache-solr-3.1.0/select?wt=ruby&q=flat&fl=_id&sort=price+asc&limit=5&offset=0
和相关的 rsolr 调用
res = solr.get 'select', :params => {
:q =>'flat',
:fl => "_id",
:sort=>'price asc',
'limit' => 5,
'offset' => 0
}
如果我从请求中删除排序,一切正常。
谁能帮帮我..
PS:我在文档中确实只有一个多值字段,但在排序中没有用到
更新:
这里是来自 solr 日志的完整堆栈跟踪
[#|2011-12-06T16:03:35.813+0530|SEVERE|glassfish3.1|org.apache.solr.core.SolrCore|_ThreadID=22;_ThreadName=Thread-1;|org.apache.solr.common.SolrException: can not sort on multivalued field: price
at org.apache.solr.schema.SchemaField.checkSortability(SchemaField.java:161)
at org.apache.solr.schema.TrieField.getSortField(TrieField.java:128)
at org.apache.solr.schema.SchemaField.getSortField(SchemaField.java:144)
at org.apache.solr.search.QueryParsing.parseSort(QueryParsing.java:385)
at org.apache.solr.search.QParser.getSort(QParser.java:251)
at org.apache.solr.handler.component.QueryComponent.prepare(QueryComponent.java:102)
at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:173)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1372)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:356)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:252)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)
|#]
[#|2011-12-06T16:03:35.814+0530|INFO|glassfish3.1|org.apache.solr.core.SolrCore|_ThreadID=22;_ThreadName=Thread-1;|[] webapp=/apache-solr-3.5.0 path=/select params={wt=ruby&q=flat&fl=_id&sort=price+asc&limit=5&offset=0} status=400 QTime=42 |#]
更新2:
正如@Mateg 所建议的,我从架构页面获得了字段详细信息。见下文
Field: price
Field Type: FLOAT
Properties: Indexed, Tokenized, Stored, Multivalued, Omit Norms
Schema: Indexed, Tokenized, Stored, Multivalued, Omit Norms
Index: Indexed, Tokenized, Stored, Omit Norms
Index Analyzer: org.apache.solr.analysis.TokenizerChain DETAILS
Query Analyzer: org.apache.solr.analysis.TokenizerChain DETAILS
它说价格字段是tokenized 和multivalued。有趣的是不仅这个字段是这样的,所有其他字段也是多值的。
【问题讨论】:
-
您使用哪个 solr 版本?你可以发布你的 solr 日志文件的转储吗?也许只是警告或严重的行。在互联网上磕磕绊绊,我发现这可能是 solr4j 库问题(如未正确安装/包含)。您使用的是定制插件吗?
-
我正在使用 solr 3.1.. 现在我将尝试使用 3.5 并让您知道结果.. 我使用 rsolr gem 从 ruby 调用它
-
也许这是一个“值”错误:如果数字中有一个“,”(比如 100,3),solr 将其读取为多值(我对非多值文本有同样的问题,并解决了它在字段值周围添加一个 CDATA 标记)
-
@SamueleMattiuzzo,我添加了来自 solr 的错误日志。请看一看。我也尝试过最新的 solr release 3.5。发生同样的错误..我也验证了逗号,价格和 created_at 字段都没有任何逗号..
-
如果有帮助,请查看此链接:wiki.apache.org/solr/SolrGlassfish 他们说 solr 和 glassfish 在处理 utf8 获取请求时遇到问题(编码完成但仍返回 404)
标签: java ruby sorting solr lucene