Alfresco搜索页面,按自定义属性排序而不是索引错误

时间:2015-05-12 13:20:39

标签: alfresco solr4

当我尝试按自定义属性排序时,我在Alfresco搜索页面中收到错误:

环境

  1. Alfresco 5.0.1
  2. Postgres
  3. Solr4
  4. tomcat 7
  5. 错误:

    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");
    

    任何想法?

3 个答案:

答案 0 :(得分:0)

仅将methodC更改为d:mltext。如果您不需要多语言支持。有时d:mltext会产生问题。

可能会在下面帮助你。

<强>原子=&#34;真&#34;
如果这是真的,则在事务中索引该属性,如果该属性未在后台索引。 如果转换所花费的时间少于为lucene.maxAtomicTransformationTime指定的值,则索引在索引之前需要转换的内容(例如PDF)将仅遵循Atomic = true。

<强> lucene.maxAtomicTransformationTime = 20 可能需要比此时间更长的内容(以毫秒为单位)的转换将在后台完成。要强制进行原子内容索引,请增加此值。

你必须知道

SOLR不执行事务内索引。

答案 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中工作并进行排序。

所描述的解决方案是我发现的最好的解决方案,希望它有所帮助。欢迎提出任何建议。