更新时间:2024-11-29 GMT+08:00

支持HBase全文索引

操作场景

通过建立HBase表和Solr索引的映射关系(通过mapping.xml文件定义映射关系),提供统一的API操作HBase和Solr,支持索引存储Solr,而原始数据存储HBase。在Solr侧查询时,可以直接查出原始数据。

不支持在distrib=false下的查询。

前提条件

已成功安装Solr、HBase服务。

操作步骤

  1. 配置集配置。

    1. 获取初始配置集模板。

      solrctl confset --generate ./confWithHBase -confWithHBase

      vi confWithHBase/conf/managed-schema

      managed-schemauniqueKey对应字段需和HBase表RowKey一一对应,其它所有字段field属性stored需定义为false,即“stored=false”;即在Solr中只存储索引,原始值存储在HBase中。

      <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
      <field name="name" type="text_general" indexed="true" stored="false"/>
      <field name="sku" type="text_en_splitting_tight" indexed="true" stored="false" omitNorms="true"/>
      
       <uniqueKey>id</uniqueKey>
    2. 创建配置集。

      solrctl confset --create test_conf ./confWithHBase

  2. 配置HBase表和Solr索引的映射关系文件“mapping.xml”

    • 在mapping.xml文件中,index区域的field必须是在Solr Collection Schema中“indexed=true”的字段,non-index区域的field必须是在Solr Collection Schema的字段。
    • 在mapping.xml中的column必须是table指定的HBase表中的列族和列。
    • 在mapping.xml中<mapping table="test_tb">表示要与Solr索引建立映射关系的HBase表名。
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <mapping table="test_tb">
       <index>
           <field name="name" column="I:n"/>
           <field name="alternative_names" column="I:a"/>
           <field name="latitude" column="I:la"/>
           <field name="longitude" column="I:ln"/>
           <field name="countrycode" column="I:x"/>
           <field name="population" column="I:p"/>
           <field name="elevation" column="I:e"/>
           <field name="timezone" column="I:t"/>
           <field name="lastupdate" column="I:las"/>
           <field name="text" column="I:tt"/>
       </index>
       <non-index>
           <field name="non_f1" column="I:n1"/>
           <field name="non_f2" column="I:n2"/>
           <field name="non_f3" column="I:n3"/>
           <field name="non_f4" column="I:n4"/>
       </non-index>
    </mapping>

  3. 创建Collection。

    • 必须通过AdminInterface接口实现类LunaAdmin创建、删除HBase表和Collection。
    • “java.lang.StringmappingFileDirPath”为mapping.xml所在文件夹路径。

    主要API:

    // Create hbase table with descriptor and split keys
    void createTable(org.apache.hadoop.hbase.HTableDescriptor desc, byte[][] splitKeys) 
    
    // Create hbase table with descriptor and split keys, create solr collection with create request in default solr root path, add solr index on hbase
    void createTable(org.apache.hadoop.hbase.HTableDescriptordesc, byte[][]splitKeys, 
    org.apache.solr.client.solrj.request.CollectionAdminRequest.CreatecreateRequest, java.lang.StringmappingFileDirPath)
    
    // Add solr collection on hbase table, with default solr root path
    void addCollection(org.apache.hadoop.hbase.TableNametable, org.apache.solr.client.solrj.request.CollectionAdminRequest.CreatecreateRequest, java.lang.StringmappingFileDirPath)
    
    // Delete hbase table, then delete solr collection of table
    void deleteTable(org.apache.hadoop.hbase.TableNametableName)
     
    // Delete solr collection of hbase table, with default solr root path
    void deleteCollection(org.apache.hadoop.hbase.TableNametable, java.lang.Stringcollection)
    
    // Delete all solr collection of hbase table, with defalut solr root path
    void deleteAllCollections(org.apache.hadoop.hbase.TableName table)
    
    // Check solr collection exists
    boolean collectionExists(java.lang.String collection) 
    
    // Check hbase table exists.
    boolean tableExists(org.apache.hadoop.hbase.TableName tableName)
    
    // Get hbase table descriptor
    org.apache.hadoop.hbase.HTableDescriptor getTableDescriptor(org.apache.hadoop.hbase.TableName tableName)

  4. 索引。

    通过AdminInterface接口实现类LunaAdmin获取Table句柄,调用HBase put API,录入数据到HBase表。在数据写入到HBase表的同时,根据mapping.xml配置在Solr中建立相应的索引。

    // Get table which handle write/read
    org.apache.hadoop.hbase.client.Table getTable(org.apache.hadoop.hbase.TableName table)

  5. 查询。

    • 在Solr侧,使用Solr原生的接口进行查询。
    • 如果要关闭掉该特性,则在查询时加上参数“query.hbase=false”。