2014-04-25 3 views
0

SearchService를 사용하여 Alfresco에서 일부 파일을 쿼리하려고합니다. 내 생각은 :Alfresco Solr SearchService.query()가 Xpath를 구문 분석하는 중 오류가 발생했습니다.

1) GET 내가 SearchService를 통해 NodeService를 통해 다음 파일

2) 가져 오기 noderef의 경로에 대한

3) 마지막으로 쿼리 솔라에서 검색 할 폴더의 noderef 특정 경로에있는 파일을 찾으려면

Solr을 쿼리 할 때 문제가 발생하면 다음 예외가 발생합니다.

ERROR [solr.core.SolrCore] [http-bio-8443-exec-1] org.apache.solr.common.SolrException: org.apache.lucene.queryParser.ParseException: **Cannot parse** 'PATH:"/{http\://www.alfresco.org/model/application/1.0}company_home/{http\://www.alfresco.org/model/application/1.0}user_homes/{http\://www.alfresco.org/model/content/1.0}abeecher/{http\://www.alfresco.org/model/content/1.0}nominas//*"': **Failed to parse XPath**... 
Unexpected '{http://www.alfresco.org/model/application/1.0}company_home/{http://www.alfresco.org/model/application/1.0}user_homes/{http://www.alfresco.org/model/content/1.0}abeecher/{http://www.alfresco.org/model/content/1.0}nominas//*' 

전체 접두어를 cm : etc ... 접두사로 바꾼 경우 쿼리가 제대로 작동합니다.

문자열을 정규식으로 변환하는 대신 "Alfresco Way"가 있습니까? 아니면 내가 잘못하고있는거야? 내가 사용

코드는 다음과 같습니다 풀 네임 스페이스 구문을 사용하여

Path path3 = nodeService.getPath(folder); 

    SearchParameters sp = new SearchParameters(); 
    sp.addStore(Repository.getStoreRef()); 
    sp.setLanguage(SearchService.LANGUAGE_LUCENE); 
    sp.setQuery("PATH:\"/{http://www.alfresco.org/model/application/1.0}company_home/{http://www.alfresco.org/model/application/1.0}user_homes/{http://www.alfresco.org/model/content/1.0}abeecher/{http://www.alfresco.org/model/content/1.0}nominas//*\"");  
    //sp.setQuery(path3);       
    //sp.setQuery(path3.toString());       
    ResultSet results = null; 
    results = searchService.query(sp); 

답변

2

AFAIK의 PATH-쿼리가 지원되지 않습니다. 여기를보세요 : http://wiki.alfresco.com/wiki/Search#Path_Queries

접두사 버전을 사용해야합니다. 그러나 접두어를 얻기 위해 정규 표현식을 사용하지 마십시오. org.alfresco.service.namespace.NamespacePrefixResolver (bean NamespaceService)은 Collection<String> getPrefixes(String namespaceURI) 메소드를 정의합니다.

Path path = nodeService.getPath(folder); 
final Map<String, String> cache = new HashMap<String, String>(); 
final StringBuilder buf = new StringBuilder(128); 
for (final Path.Element e : path) 
{ 
    if (e instanceof Path.ChildAssocElement) 
    { 
     final QName qname = ((Path.ChildAssocElement)e).getRef().getQName(); 
     if (qname != null) 
     { 
      String prefix = cache.get(qname.getNamespaceURI()); 
      if (prefix == null) 
      { 
       // first request for this namespace prefix, get and cache result 
       Collection<String> prefixes = ns.getPrefixes(qname.getNamespaceURI()); 
       prefix = prefixes.size() != 0 ? prefixes.iterator().next() : ""; 
       cache.put(qname.getNamespaceURI(), prefix); 
      } 
      buf.append('/').append(prefix).append(':').append(ISO9075.encode(qname.getLocalName())); 
     } 
    } 
    else 
    { 
     buf.append('/').append(e.toString()); 
    } 
} 
String searchPath = buf.toString(); 
:

당신의 더미 코드는 노드의 QNamePath를 얻을 수

관련 문제