:original_name: mrs_01_0493.html .. _mrs_01_0493: Supporting Full-Text Index ========================== You can create tables and indexes using **createTable** of **org.apache.luna.client.LunaAdmin** and specify table names, column family names, requests for creating indexes, as well as the directory path for storing mapping files. You can also add indexes to existing tables using **addCollection** and obtain tables to perform a scan operation by using **getTable** of **org.apache.luna.client.LunaAdmin**. The column name and column family name of a table consist of letters, digits, and underscores (_) but cannot contain any special characters. HBase tables with a full-text index have the following limitations: - Disaster recovery, backup, and restoration are not supported. - Rows and column families cannot be deleted. - Tight consistency is not supported by the query on Solr. Code Snippet Example -------------------- The following code snippet belongs to the **testFullTextScan** method in the **LunaSample** class of the **hbase.examples** package. .. code-block:: public static void testFullTextScan() throws Exception { /** * Create create request of Solr. Specify collection name, confset name, * number of shards, and number of replication factor. */ Create create = new Create(); create.setCollectionName(COLLECTION_NAME); create.setConfigName(CONFSET_NAME); create.setNumShards(NUM_OF_SHARDS); create.setReplicationFactor(NUM_OF_REPLICATIONFACTOR); /** * Create mapping. Specify index fields(mandatory) and non-index * fields(optional). */ List indexedFields = new ArrayList(); indexedFields.add(new ColumnField("name", "f:n")); indexedFields.add(new ColumnField("cat", "f:t")); indexedFields.add(new ColumnField("features", "f:d")); Mapping mapping = new Mapping(indexedFields); /** * Create table descriptor of HBase. */ HTableDescriptor desc = new HTableDescriptor(HBASE_TABLE); desc.addFamily(new HColumnDescriptor(TABLE_FAMILY)); /** * Create table and collection at the same time. */ LunaAdmin admin = null; try { admin = new AdminSingleton().getAdmin(); admin.deleteTable(HBASE_TABLE); if (!admin.tableExists(HBASE_TABLE)) { admin.createTable(desc, Bytes.toByteArrays(new String[] { "0", "1", "2", "3", "4" }), create, mapping); } /** * Put data. */ Table table = admin.getTable(HBASE_TABLE); int i = 0; while (i < 5) { byte[] row = Bytes.toBytes(i + "+sohrowkey"); Put put = new Put(row); put.addColumn(TABLE_FAMILY, Bytes.toBytes("n"), Bytes.toBytes("ZhangSan" + i)); put.addColumn(TABLE_FAMILY, Bytes.toBytes("t"), Bytes.toBytes("CO" + i)); put.addColumn(TABLE_FAMILY, Bytes.toBytes("d"), Bytes.toBytes("Male, Leader of M.O" + i)); table.put(put); i++; } /** * Scan table. */ Scan scan = new Scan(); SolrQuery query = new SolrQuery(); query.setQuery("name:ZhangSan1 AND cat:CO1"); Filter filter = new FullTextFilter(query, COLLECTION_NAME); scan.setFilter(filter); ResultScanner scanner = table.getScanner(scan); LOG.info("-----------------records----------------"); for (Result r = scanner.next(); r != null; r = scanner.next()) { for (Cell cell : r.rawCells()) { LOG.info(Bytes.toString(CellUtil.cloneRow(cell)) + ":" + Bytes.toString(CellUtil.cloneFamily(cell)) + "," + Bytes.toString(CellUtil.cloneQualifier(cell)) + "," + Bytes.toString(CellUtil.cloneValue(cell))); } } LOG.info("-------------------end------------------"); /** * Delete collection. */ admin.deleteCollection(HBASE_TABLE, COLLECTION_NAME); /** * Delete table. */ admin.deleteTable(HBASE_TABLE); } catch (IOException e) { e.printStackTrace(); } finally { /** * When everything done, close LunaAdmin. */ admin.close(); } } Precautions ----------- - Tables and indexes to be created must be unique. - Use LunaAdmin only to obtain tables to perform a scan operation.