com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links' is unknown.

Add Apache Solr-Based Indexing

The API Manager has Apache Solr based indexing for API documentation content. It provides both the API Publisher and Store full-text search facility to search through API documentation, find documents and related APIs. The search syntax is doc:keyword. Search criteria looks for the keyword in any word/phrase in the documentation content and returns both the matching documents and associated APIs.

The following media types have Apache Solr based indexers by default, configured using the <Indexers> element in <APIM_HOME>/repository/conf/registry.xml.

  • Text : text/plain
  • PDF : application/pdf
  • MS word : application/msword
  • MS Powerpoint : application/vnd.ms-powerpoint
  • MS Excel : application/vnd.ms-excel
  • XML : application/xml

Writing a custom index

In addition to the default ones, you can write your own indexer implementation and register it as follows:

  1. Write a custom indexer. Given below is a sample indexer code.

    package org.wso2.indexing.sample;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Arrays;
    import org.apache.solr.common.SolrException;
    import org.wso2.carbon.registry.core.exceptions.RegistryException;
    import org.wso2.carbon.registry.core.utils.RegistryUtils;
    import org.wso2.carbon.registry.indexing.IndexingConstants;
    import org.wso2.carbon.registry.indexing.AsyncIndexer.File2Index;
    import org.wso2.carbon.registry.indexing.indexer.Indexer;
    import org.wso2.carbon.registry.indexing.solr.IndexDocument;
    
    public class PlainTextIndexer implements Indexer {
        public IndexDocument getIndexedDocument(File2Index fileData) throws SolrException,
                RegistryException {
                 
                 /* Create index document with resource path and raw content*/
                 IndexDocument indexDoc = new IndexDocument(fileData.path, RegistryUtils.decodeBytes(fileData.data), null);
                 
                 /* You can specify required field/value pairs for this indexing document.
                  * When searching we can query on these fields  */
                 Map<String, List<String>> fields = new HashMap<String, List<String>>();
                 fields.put("path", Arrays.asList(fileData.path));
                                         
                 if (fileData.mediaType != null) {
                             fields.put(IndexingConstants.FIELD_MEDIA_TYPE, Arrays.asList(fileData.mediaType));
                 } else {
                             fields.put(IndexingConstants.FIELD_MEDIA_TYPE, Arrays.asList("text/plain"));
                 }
                 
                 /* set fields for index document*/
                 indexDoc.setFields(fields);             
                 return indexDoc;
        }    
    }
  2. Add the custom indexer JAR file to <APIM_HOME>/repository/components/lib directory.

  3. Update the <Indexers> element in <APIM_HOME>/repository/conf/registry.xml file with the new indexer. The content is indexed using this media type. For example,

    <indexers>
         <indexer class="org.wso2.indexing.sample.PlainTextIndexer" mediaTypeRegEx="text/plain" profiles="default,api-store,api-publisher"/>
    </indexers>

    The attributes of the above configuration are described below:

    classJava class name of the indexer
    mefiaTypeRegExA regex pattern to match the media type
    profilesAPIM profiles in which the indexer is available
  4. Restart the server.
  5. Add API documentation using the new media type and then search some term in the documentation using the syntax (doc:keyword). You will see how the documentation has got indexed according to the media type.
com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links2' is unknown.