CDH中SOLR配置IK中文分词器的方法(血泪教训,关于IK jar的存放位置)

网上关于SOLR配置IK中文分词的文章有很多,以下是我的测试步骤:

测试于:Solr 4.5.1, IK Analyzer 2012FF_hf1, Jdk 1.6.0_45, Tomcat 6.0.37 | CentOS 5.7

配置步骤:

从googlecode上下载针对solr4的ik版本IK Analyzer 2012FF_hf1.zip(https://code.google.com/p/ik-analyzer/downloads/list)
解压后将IKAnalyzer2012FF_u1.jar上传到solr lib中,如:
/opt/tomcat/webapps/solr/WEB-INF/lib
在core的schema中加入ik分词类型,如下代码需要放在<types>…</types>中,推荐放在最后
<!– ik analyzer Chinese –>
<fieldType name=”text_ik” class=”solr.TextField”>
<analyzer class=”org.wltea.analyzer.lucene.IKAnalyzer”/>
</fieldType>
在core的schema中应用我们新定义的类型,如:
<field name=”id” type=”string” indexed=”true” stored=”true” required=”true” />
<field name=”title” type=”text_ik” indexed=”true” stored=”true” termVectors=”true”/>
<field name=”content” type=”text_ik” indexed=”false” stored=”true”/>
<field name=”create_time” type=”date” indexed=”true” stored=”true”/>
<field name=”update_time” type=”date” indexed=”true” stored=”true”/>
重启tomcat

但是在CDH下面,确定solr的lib位置成了一个问题。

开始以为是在/var/lib/solr/tomcat-deployment/webapps/solr/WEB-INF/lib下面,把IK jar包放进去重启solr服务发现提示没有找到IK的类!

再次查看上面的目录发现重启前传入的IK jar包居然不见了~

可能的原因应该是启动时该目录被清空然后从其他lib目录传入了jar。(可能 应该 的说法好不严谨啊。。。)

然后再次find 了一下上上述目录中的jar包,发现以下目录均存在:

/var/lib/solr/tomcat-deployment/webapps/solr/WEB-INF/lib/lucene-core.jar
/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/solr/webapps/solr/WEB-INF/lib/lucene-core.jar
/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/hbase-solr/lib/lucene-core.jar
/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/search/lib/lucene-core.jar
/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/search/lib/search-crunch/lucene-core.jar
/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/kite/lib/lucene-core.jar

难道是从/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/solr/webapps/solr/WEB-INF/lib这个目录copy jar包的?

把IK jar包传到/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/solr/webapps/solr/WEB-INF/lib目录下面,再次重启solr服务,发现/var/lib/solr/tomcat-deployment/webapps/solr/WEB-INF/lib下面果然有IK的jar包了。

so,正确的jar包目录应该是/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/solr/webapps/solr/WEB-INF/lib。

CDH中Lily HBase Indexer(Key-value Store Indexer)的配置使用

CDH版本: 4.5.7

前段时间在学习Solr的知识。做了一个测试系统,精确查询使用HBase来做,模糊查询使用Solr。

Hbase的数据录入直接采用原生API,效率还不错。但是当向Solr录入数据建立索引时时常会发生异常。

所以学习了一下Lily Hbase Indexer来为Hbase的数据在solr建立索引。

 

1.在 HBase 列系列上启用复制

确保已启用群集范围内的 HBase 复制。使用 HBase shell 定义列系列复制设置。

对于每个现有表,在需要通过发出格式命令进行索引的每个列系列上设置 REPLICATION_SCOPE

$ hbase shell
hbase shell> disable 'record'
hbase shell> alter 'record', {NAME => 'data', REPLICATION_SCOPE => 1}
hbase shell> enable 'record'

对于每个新表,在需要通过发出格式命令进行索引的每个列系列上设置 REPLICATION_SCOPE

$ hbase shell hbase shell> create 'record', {NAME => 'data', REPLICATION_SCOPE => 1}

2.创建相应的 SolrCloud 集合

用于 HBase 索引的 SolrCloud 集合必须具有可容纳 HBase 列系列的类型和要进行索引处理的限定符的 Solr 架构。使用以下表单命令创建 SolrCloud 集合:

<1>生产实体配置文件:
    $ solrctl instancedir --generate /etc/solr/conf/record
<2>编辑Collection的Schema.xml文件,根据自己的需求确定。
    $ edit /etc/solr/conf/record/conf/schema.xml 
<3>上传实体配置文件至zookeeper
    $ solrctl instancedir --create record /etc/solr/conf/record
<4>使用实体配置文件建立collection
    $ solrctl collection --create record

3.创建 Lily HBase Indexer 配置

$ vi /etc/solr/conf/morphline-hbase-mapper.xml

<?xml version="1.0"?>
<indexer table="record" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">

   <!-- The relative or absolute path on the local file system to the morphline configuration file. -->
   <!-- Use relative path "morphlines.conf" for morphlines managed by Cloudera Manager -->
   <param name="morphlineFile" value="/etc/hbase-solr/conf/morphlines.conf"/>

   <!-- The optional morphlineId identifies a morphline if there are multiple morphlines in morphlines.conf -->
   <!-- <param name="morphlineId" value="morphline1"/> -->

</indexer>

4.创建 Morphline 配置文件.

在CDH 管理界面进入Key-Value Store Indexer面板->配置->服务范围->Morphlines->Morphlines文件。
$ vi /etc/hbase-solr/conf/morphlines.conf

morphlines : [
  {
    id : morphline1
    importCommands : ["org.kitesdk.morphline.**", "com.ngdata.**"]

    commands : [                    
      {
        extractHBaseCells {
          mappings : [
            {
              inputColumn : "data:title"
              outputField : "title"
              type : string 
              source : value
            }

            {
              inputColumn : "data:subject"
              outputField : "subject"
             type : "byte[]"
             source : value
            }
          ]
        }
      }

      #for avro use with type : "byte[]" in extractHBaseCells mapping above
      #{ readAvroContainer {} } 
      #{ 
      #  extractAvroPaths {
      #    paths : { 
      #      data : /user_name      
      #    }
      #  }
      #}

      { logTrace { format : "output record: {}", args : ["@{}"] } }
    ]
  }
]

id:表示当前morphlines文件的ID名称。

importCommands:需要引入的命令包地址。

extractHBaseCells:该命令用来读取HBase列数据并写入到SolrInputDocument对象中,该命令必须包含零个或者多个mappings命令对象。

mappings:用来指定HBase列限定符的字段映射。

inputColumn:需要写入到solr中的HBase列字段。值包含列族和列限定符,并用‘ : ’分开。其中列限定符也可以使用通配符‘*’来表示,譬如可以使用data:*表示读取只要列族为data的所有hbase列数据,也可以通过data:my*来表示读取列族为data列限定符已my开头的字段值。

outputField:用来表示morphline读取的记录需要输出的数据字段名称,该名称必须和solr中的schema.xml文件的字段名称保持一致,否则写入不正确。

type:用来定义读取HBase数据的数据类型,我们知道HBase中的数据都是以byte[]的形式保存,但是所有的内容在Solr中索引为text形式,所以需要一个方法来把byte[]类型转换为实际的数据类型。type参数的值就是用来做这件事情的。现在支持的数据类型有:byte[](原封不动的拷贝hbase中的byte[]数据),int,long,string,boolean,float,double,short和bigdecimal。当然你也可以指定自定的数据类型,只需要实现com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口即可。

source:用来指定HBase的KeyValue那一部分作为索引输入数据,可选的有‘value’和’qualifier’,当为value的时候表示使用HBase的列值作为索引输入,当为qualifier的时候表示使用HBase的列限定符作为索引输入。

5.注册Lily HBase Indexer配置文件到Lily HBase Indexer Service服务中

当前面的所有步骤完成之后,我们需要把Lily HBase Indexer的配置文件注册到Zookeeper中,使用如下命令:

hbase-indexer add-indexer -n recordIndexer -c /etc/solr/conf/morphline-hbase-mapper.xml –connection-param  solr.zk=xhadoop1:2181,xhadoop2:2181,xhadoop3:2181,xhadoop4:2181,xhadoop5:2181/solr  –connection-param solr.collection=record –zookeeper xhadoop1:2181,xhadoop2:2181,xhadoop3:2181,xhadoop4:21281,xhadoop5:2181

当前面5条全部按序完成后,就可以测试hbase数据输入Solr索引数据了。

6.HBase写入数据

向HBase中配置的索引表写入数据,如下:

put ‘record’,’row6′,’data:title’,’Good Luck!My love’
当写入数据后,稍过几秒我们可以在相对于的solr中查询到该插入的数据,表明配置已经成功。

{ “responseHeader“: { “status“: 0, “QTime“: 14, “params“: { “q“: “title:Good”, “_“: “1447069417938”, “wt“: “json” } }, “response“: { “numFound“: 1, “start“: 0, “maxScore“: 0.15342641, “docs“: [ { “id“: “row6”, “title“: [ “Good Luck!My love” ], “_version_“: 1517358513903370200 } ] } }