当我尝试按自定义属性排序时,我在Alfresco搜索页面中收到错误:
环境:
错误:
2015-05-12 12:54:34,864 ERROR [solr.core.SolrCore] [http-bio-8443-exec-7] org.apache.solr.common.SolrException: sort param could not be parsed as a query, and is not a field that exists in the index: @{http://global.oup.com/dam/model/1.0}supplierName
at org.apache.solr.search.QueryParsing.parseSortSpec(QueryParsing.java:358)
at org.alfresco.solr.query.AbstractQParser.getSort(AbstractQParser.java:569)
at org.apache.solr.handler.component.QueryComponent.prepare(QueryComponent.java:175)
at org.apache.solr.handler.component.AlfrescoSearchHandler.handleRequestBody(AlfrescoSearchHandler.java:233)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1962)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:777)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:418)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:207)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:613)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.solr.search.SyntaxError: Expected identifier at pos 0 str='@{http://global.oup.com/dam/model/1.0}supplierName desc'
at org.apache.solr.search.QueryParsing$StrParser.getId(QueryParsing.java:770)
at org.apache.solr.search.QueryParsing$StrParser.getId(QueryParsing.java:749)
at org.apache.solr.search.FunctionQParser.parseValueSource(FunctionQParser.java:345)
at org.apache.solr.search.FunctionQParser.parse(FunctionQParser.java:68)
at org.apache.solr.search.QParser.getQuery(QParser.java:141)
at org.apache.solr.search.QueryParsing.parseSortSpec(QueryParsing.java:286)
... 25 more
我的自定义字段在内容模型文件中配置如下:
<types>
<type name="oup:asset">
<title>Asset</title>
<parent>ipp:asset</parent>
<property name='oup:supplierName'>
<title>Supplier Name</title>
<description>Name of the supplier (note there is also a supplier
specified on asset rights)
</description>
<type>d:mltext</type>
<mandatory enforced='false'>true</mandatory>
<multiple>true</multiple>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>both</tokenised>
</index>
</property>
</type>
</types>
据我所知,索引配置应该没问题,我也尝试将atomic
放到false
但没有运气。
上述配置使用 Alfresco 4.1.1 和 Solr 1 正常运行,但现在,移植到 Alfresco 5 和 Solr 4 不起作用。
我使用搜索服务从Alfresco管理页面中的javascript控制台尝试了js代码,并且排序适用于cm:name但不适用于oup:supplierName,代码如下:
var orderedNodes = search.luceneSearch("@cm\\:name:\"my-file\"", "@oup:supplierName", false);
logger.log("retrieved " + orderedNodes.length + " nodes\n");
任何想法?
答案 0 :(得分:0)
仅将methodC
更改为d:mltext
。如果您不需要多语言支持。有时d:mltext会产生问题。
可能会在下面帮助你。
<强>原子=&#34;真&#34; 强>
如果这是真的,则在事务中索引该属性,如果该属性未在后台索引。
如果转换所花费的时间少于为lucene.maxAtomicTransformationTime指定的值,则索引在索引之前需要转换的内容(例如PDF)将仅遵循Atomic = true。
<强> lucene.maxAtomicTransformationTime = 20 强> 可能需要比此时间更长的内容(以毫秒为单位)的转换将在后台完成。要强制进行原子内容索引,请增加此值。
你必须知道
答案 1 :(得分:0)
我发现问题,它是一个Solr4错误/行为,当它试图执行多个属性的排序,如Alfresco多值属性 -
我在Solr网络应用程序中找到了这段代码:
private void addSortSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField)
{
// Can only order on single valued fields
DataTypeDefinition dataTypeDefinition = propertyDefinition.getDataType();
if(dataTypeDefinition.getName().equals(DataTypeDefinition.TEXT))
{
if(propertyDefinition.isMultiValued() == false)
{
if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE)
|| (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH))
{
indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true);
}
else if (isIdentifierTextProperty(propertyDefinition.getName()))
{
indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false);
}
else
{
indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false);
}
}
}
if(dataTypeDefinition.getName().equals(DataTypeDefinition.MLTEXT))
{
if(propertyDefinition.isMultiValued() == false)
{
if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE)
|| (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH))
{
indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true);
}
else
{
indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false);
}
}
}
}
因此,它只在propertyDefinition.isMultiValued() == false
进行排序,然后在代码中抛出异常,因为它无法映射QName。
是吗?
有没有办法在没有编码的情况下跳过它?
如果没有,我认为修复它的唯一方法是以某种方式覆盖Spring bean以使用我们的自定义函数,任何建议这样做而不需要部署Solr吗?
或者可能是Spring AOP,但说实话,我不喜欢这个想法。
任何可能的解决方案?
答案 2 :(得分:0)
我找到了解决办法:
在内容模型中创建一个新属性,只是文本。这个是多值字段的字符串表示,也是索引;
使用两个策略创建行为:onUpdatePolicy和onCreatePolicy,用于表示多值字段的字符串表示形式;
创建一个补丁(Spring bean),为所有旧内容设置新字段的值;
该字段对所有UI都是隐藏的,用户无法设置。 它被编入索引以使分面搜索在alfresco 5中工作并进行排序。
所描述的解决方案是我发现的最好的解决方案,希望它有所帮助。欢迎提出任何建议。