The searcher component decides which indexing service to call for queries against a given store. Each store may support different indexing and different query languages. The default indexing store uses lucene to provide indexing and query support. It supports two languages: lucene and a very limited, but optimised, XPath implementation. The functionality of this xpath expression will be expanded over time.

2.1 Optimised XPath langauge

This can be called using the ‘xpath’ language specifier (case insensitive)

The implementation currently supports the following axes:

  • child
  • descendant
  • descendant-or-self
  • parent
  • self

It does not currently support the attribute axis or predictes.
These are next on the road map.

Parameterisation using $namsespace:name is not supported.

However text replacement is supported using ${namespace:name}

These queries can be canned in the query register.

2.1.1 Examples

The optimised xpath syntax is identical to that used for the PATH field in lucene queries.
Any PATH content below in the lucene query examples is also a valid xpath query.

Find all the attributes available for all nodes at any level (excluding the root node)
ResultSet results = searcher.query(storeRef, 'xpath', '//*', null, null);
Generate a query entirely by variable substitution
QueryParameterDefinition paramDef = new QueryParameterDefImpl(QName.createQName('alf:query', namespacePrefixResolver), (PropertyTypeDefinition) null, true, '//./*');
ResultSet results = searcher.query(storeRef, 'xpath', '${alf:query}', null, new QueryParameterDefinition[] { paramDef });

2.2 Lucene Language

This is the recommended language as it is supported by the recommended indexer.

The query language is described on the Lucene site http://lucene.apache.org/java/2_4_0/queryparsersyntax.html. The QueryParser has been modified to allow wild cards at the start of wild card query elements otherwise the syntax is the same.

Note that certain characters need to be escaped in the query string. There is support to do this on a static method on the LuceneQueryParser.

The following fields are available

  • ASPECT
    – All the aspects of the node
    – Tokenised as the fully qualified qname of each aspect
  • FTSSTATUS
    – Indicates if there are attributes waiting to be indexed in the back ground. Could be used to – indicate that full text searches may be out of date matches
  • ID
    – The id from the node reference - all nodes in the index are from the same store
    – A UUID
  • PARENT
    – All the parent IDs (UUIDs)
  • PATH
    – An XPATH expression used to select nodes
    – This should only be access via a phrase query (ie in ‘’) as it requires special tokenisation
  • PRIMARYPARENT
    – The ID of the primary parent node
  • QNAME
    – All the QNames by which this node is known in its parents
    – Should be queried using phrases as it requires special tokenisation
  • TEXT
    – The full text representation of the node content
  • TYPE
    – The fully qualified type of the node

Attributes as fields

  • @{namespace-uri}name

Attributes should be searched using phrase expressions.

The following fields are used internally

  • ANCESTOR
  • ISCONTAINER
  • ISROOT
  • ISNODE
  • TX

2.2.1 Examples

// Find all the nodes under the root node by QName namespace:one
// The prefix must be resolved to a URI
ResultSet results = searcher.query(rootNodeRef.getStoreRef(), 'lucene', 'PATH:\'/namespace:one\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:one/namespace:five\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:one/namespace:five/namespace:twelve\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:*/namespace:*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:*/namespace:*/namespace:*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:one/namespace:*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:*/namespace:five/namespace:*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:one/namespace:*/namespace:nine\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/*/*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/*/namespace:five\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/*/*/*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:one/*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/*/namespace:five/*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/namespace:one/*/namespace:nine\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'//.\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'//*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'//*/.\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'//*/./.\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'//./*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'//././*/././.\'', null, null);
// Examples using the default namespace
results = searcher.query(storeRef, 'lucene', 'PATH:\'//common\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/one//common\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/one/five//*\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/one/five//.\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/one//five/nine\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/one//thirteen/fourteen\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/one//thirteen/fourteen//.\'', null, null);
results = searcher.query(storeRef, 'lucene', 'PATH:\'/one//thirteen/fourteen//.//.\'', null, null);

Type based queries.

escapeQName uses QueryParser static method to escape the string.

QName qname = QName.createQName(NamespaceService.ALFRESCO_URI, 'int-ista');
results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(qname) + ':\'01\'', null, null);

qname = QName.createQName(NamespaceService.ALFRESCO_URI, 'long-ista');
results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(qname) + ':\'2\'', null, null);

qname = QName.createQName(NamespaceService.ALFRESCO_URI, 'float-ista');
results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(qname) + ':\'3.4\'', null, null);

results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'double-ista')) + ':\'5.6\'', null, null);

Date date = new Date();
String sDate = CachingDateFormat.getDateFormat().format(date);
results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'date-ista')) + ':\'' + sDate + '\'', null, null);

results = searcher.query(storeRef, 'lucene',
               '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'datetime-ista')) + ':\'' + sDate + '\'', null, null);

results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'boolean-ista')) + ':\'true\'', null,
               null);

results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'qname-ista')) + ':\'{wibble}wobble\'',
               null, null);
results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'guid-ista')) + ':\'My-GUID\'', null,
               null);

results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'category-ista')) + ':\'CategoryId\'',
               null, null);

results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'noderef-ista')) + ':\'' + n1 + '\'',
               null, null);

results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(QName.createQName(NamespaceService.ALFRESCO_URI, 'path-ista')) + ':\''
               + nodeService.getPath(n3) + '\'', null, null);

Queries based on type.

results = searcher.query(storeRef, 'lucene', 'TYPE:\'' + testType.toString() + '\'', null, null);

results = searcher.query(storeRef, 'lucene', 'TYPE:\'' + testSuperType.toString() + '\'', null, null);

results = searcher.query(storeRef, 'lucene', 'ASPECT:\'' + testAspect.toString() + '\'', null, null);

results = searcher.query(storeRef, 'lucene', 'ASPECT:\'' + testSuperAspect.toString() + '\'', null, null);

Full text search examples

results = searcher.query(storeRef, 'lucene', 'TEXT:\'fox\'', null, null);

QName queryQName = QName.createQName('alf:test1', namespacePrefixResolver);
results = searcher.query(storeRef, queryQName, null);

Canned queries and query parameters

queryQName = QName.createQName('alf:test2', namespacePrefixResolver);
results = searcher.query(storeRef, queryQName, null);

queryQName = QName.createQName('alf:test2', namespacePrefixResolver);
QueryParameter qp = new QueryParameter(QName.createQName('alf:banana', namespacePrefixResolver), 'woof');
results = searcher.query(storeRef, queryQName, new QueryParameter[] { qp });

queryQName = QName.createQName('alf:test3', namespacePrefixResolver);
qp = new QueryParameter(QName.createQName('alf:banana', namespacePrefixResolver), '/one/five//*');
results = searcher.query(storeRef, queryQName, new QueryParameter[] { qp });

// TODO: should not have a null property type definition
QueryParameterDefImpl paramDef = new QueryParameterDefImpl(QName.createQName('alf:lemur', namespacePrefixResolver), (PropertyTypeDefinition) null, true, 'fox');
results = searcher.query(storeRef, 'lucene', 'TEXT:\'${alf:lemur}\'', null, new QueryParameterDefinition[] { paramDef });

paramDef = new QueryParameterDefImpl(QName.createQName('alf:intvalue', namespacePrefixResolver), (PropertyTypeDefinition) null, true, '1');
qname = QName.createQName(NamespaceService.ALFRESCO_URI, 'int-ista');
results = searcher.query(storeRef, 'lucene', '\\@' + escapeQName(qname) + ':\'${alf:intvalue}\'', null, new QueryParameterDefinition[] { paramDef });

Other

results = searcher.query(rootNodeRef.getStoreRef(), 'lucene', 'PARENT:\'' + rootNodeRef.toString() + '\'', null, null);

results = searcher.query(rootNodeRef.getStoreRef(), 'lucene', '+PARENT:\'' + rootNodeRef.toString() + '\' +QNAME:\'one\'', null, null);
文档更新时间: 2020-02-15 16:55   作者:凌云文档