`
brandNewUser
  • 浏览: 456877 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Solr-DIH建立索引并执行简单初步的查询

阅读更多
我们将solr的安装目录设置为$SOLR_INSTALL,
 
./solr start,不使用任何原有的examples来进行,启动完成后,不存在任何的core,提示No cores available。
 
在手动执行Add Core操作时,需要保证instanceDir和dataDir事先必须存在,以便能够建立目录成功。
 


 
 
根据错误提示,目录应该建立在$SOLR_INSTALL/server/solr/下,且必须保证存在对应的配置文件;可以从example/conf目录下拷贝所有的配置文件至该目录下(solrconfig.xml,managed-schema等文件也必须存在)。
 
在solrconfig.xml配置文件中,增加requestHandler来处理数据导入相关:
 
<requestHandler name="/dataimport" class="solr.DataImportHandler">
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
  </requestHandler>
 
 
由于使用DIH需要依赖其他的jar包,所以需要定义lib标签,dataimporthandler的相关jar包在${SOLR_INSTALL}/dist下:
 
  
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />  
 
 
需要定义db-data-config.xml配置文件,对应数据库相关的配置以及商品查询相关配置:
 
<dataConfig>  
  <dataSource type="JdbcDataSource"  
              driver="com.mysql.jdbc.Driver"  
              convertType="true"  
              url="jdbc:mysql://xxxx"  
              user="xxx"  
              password="xxx"/>  
  <document>  
    <entity name="gt_goods" query="select goods_id, goods_sn, goods_name,price, stock from gt_goods" >  
    </entity>  
  </document>  
</dataConfig>  
 
 
注意,我们使用到的mysql驱动需要在目录下存在:$SOLR_INSTALL/server/solr-webapp/webapp/WEB-INF/lib。
 
entity标签的配置需要与另外一个配置文件配合使用:schema.xml(新版本后名称已经改为managed-schema),在其中定义了field和fieldtype,根据我们前面的配置需要重新定义。
 
在schema.xml(managed-schema)中,需要将对应的unique-key等标签设置正确,否则系统启动时会进行校验并提示错误。
 
但是启动后,提示no dataimport-handler defined!
 



 
 
 
原来居然是配置文件没有保存成功,出现下面的界面后,说明/dataimport已经可用:
 


 
 
但是却没有索引成功,提示下面的相关信息:
 

Last Update: 20:41:08

Indexing completed. Added/Updated: 0 documents. Deleted 0 documents. (Duration: 12s)
Requests: 1 (0/s)Fetched: 54223 (4519/s)Skipped: 0, Processed: 0 (0/s)
Started
 
没有增加任何documents,持续十二秒,根据fetched的size,拿到的数据库表记录条目数量与count(*)得到的结果一致,但是却没有加入任何的数据。
 
经过一通查找,将managed-schema中的<schema name="gt_goods" version="1.6”>需要与db-data-config.xml文件中的entity标签名称保持一致:    <entity name="gt_goods" query="select goods_id, goods_sn, goods_name,price, stock from gt_goods" >  。
 
执行后,仍然没有成功(说明不是前一步导致),最后发现将所有的dynamicField都已经被删除,加上一个就可以了:
 
<dynamicField name="*"  type="string"  indexed="true"  stored="true" />
 
 
分词策略
 
我们使用提供的query进行查询时,例如查询商品名称 goods_name:刺绣花边,查出的结果为472条,经过对查询结果的分析,可以看出与下面的查询非常类似,solr只是简单地对词语进行逐字分词查询。
 
select count(*) from gt_goods where goods_name like '%刺%' or goods_name like '%花%' or goods_name like '%边%' or goods_name like '%绣%';
 
 
这种分词对于查询来说非常原始,而且不准确。
 



 
 
 
mmseg4j
 
 
加入依赖,对于mmseg4j的支持,以及lucene-analysis的实现,便于以后加入到solr中。
 
<dependency>
            <groupId>com.chenlb.mmseg4j</groupId>
            <artifactId>mmseg4j-core</artifactId>
            <version>1.9.1</version>
        </dependency>

        <dependency>
            <groupId>com.chenlb.mmseg4j</groupId>
            <artifactId>mmseg4j-analysis</artifactId>
            <version>1.9.1</version>
        </dependency>
 
 
在mmseg4j-core-with-dic中(只有1.8.6版本)有example包,对应各种分词策略的示例,执行main()函数即可。此外,还包括/data/目录,用于存放mmseg4j用到的中文字典文件。
 
字典文件的加载是从Dictionary.getInstance()开始,public static Dictionary getInstance(),从默认目录加载词库文件,查找默认目录顺序:
  • 从系统属性mmseg.dic.path指定的目录中加载
  • 从classpath/data目录
  • 从user.dir/data目录
 
可以加载自定义分词的文件,加载words-xxx.dic作为扩展词库目录,我们可以根据需要在该目录下加上对应的词组。
 
我们在普通情况下,并不会将“阿玛尼”作为一个品牌,拆出来的词以每个单词划分:“阿 | 玛 | 尼”;而当我们在文件words-xxx.dic中加入该单词后,就可以正常地将该词分开。
 
在managed-schema中加入mmseg4j的这3种分析类型:
 
<fieldType name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="/Users/xxx/develop/tools/solr-5.5.0/data"/>
      </analyzer>
    </fieldType>
    <fieldType name="text_mmseg4j_complex" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="/Users/xxx/develop/tools/solr-5.5.0/data"/>
      </analyzer>
    </fieldType>
    <fieldType name="text_mmseg4j_maxword" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="/Users/xxx/develop/tools/solr-5.5.0/data"/>
      </analyzer>
    </fieldType>
 
 
并设置我们使用的goods_name为这种类型:
 
   <field name="goods_name" type="text_mmseg4j_complex" indexed="true" stored="true"/>
 
重启solr,显示该core已经无法正常加载出来:
 
xxx: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Could not load conf for core zhentest: Can't load schema /Users/xxx/develop/tools/solr-5.5.0/server/solr/zhentest/conf/managed-schema: Plugin init failure for [schema.xml] fieldType "text_mmseg4j_simple": Plugin init failure for [schema.xml] analyzer/tokenizer: Error loading class 'com.chenlb.mmseg4j.solr.MMSegTokenizerFactory'
 
 
原因是我们依赖的jar包并没有加入到WEB-INF/lib中,此外还需要依赖:
 
<dependency>
            <groupId>com.chenlb.mmseg4j</groupId>
            <artifactId>mmseg4j-solr</artifactId>
            <version>1.9.1</version>
        </dependency>
 
 
作为mmseg4j和solr之间的桥梁,否则会出现com.chenlb.mmseg4j.solr.MMSegTokenizerFactory找不到的错误。
 
版本兼容也是一个大问题,最终的依赖关系为:
 
  • solr: 5.5.0
  • mmseg4j-solr: 2.3.0
  • mmseg4j-core: 1.10.0
 
终于成功查询出商品的结果:
 


 
 
因为之前索引用到的数据也没有经过合理地分词,所以在更改分词策略后,需要对所有的数据进行统一的/dataimport操作。在对所有的数据进行重新整理后,查询出来的记录条目数量就可以满足基本的需求,在对“刺绣花边”进行搜索时,就可以查询出最终的结果与下面的sql查询数量保持一致(因为words.dic中存在“刺绣”和“花边”两个词):
 
select count(*) from gt_goods where goods_name like '%刺绣%' or goods_name like '%花边%';
 
 
 
 
  • 大小: 96.6 KB
  • 大小: 128.8 KB
  • 大小: 21.2 KB
  • 大小: 84.3 KB
  • 大小: 65.3 KB
  • 大小: 34.9 KB
分享到:
评论

相关推荐

    solr-mongo-importer-1.1.0.jar

    solr-mongo-importer-1.1.0.jar solr-mongo-importer-1.1.0.jar solr-mongo-importer-1.1.0.jar

    apache-solr-dataimportscheduler-1.0.zip_official54l_solr 5.x定时生成

    在Solr中,数据导入通常通过DataImportHandler (DIH) 完成,DIH是一个插件,负责从外部数据源(如数据库或文件系统)提取数据并将其转化为Solr可以处理的格式。而DataImportScheduler则是在DIH的基础上,增加了一个...

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    为了保持索引与源数据的一致性,Solr引入了DIH,这是一个内建的机制,用于从关系数据库、XML文件等外部数据源导入数据,并将其转化为Solr可以处理的索引格式。 数据导入调度器(Data Import Scheduler)是DIH的一个...

    solr增量更新架包apache-solr-dataimportscheduler.jar

    - **DataConfig.xml**: 这是DIH的配置文件,定义了数据源、查询语句以及如何映射数据到Solr文档。在增量更新配置中,你需要指定增量字段,Solr将根据该字段的改变来判断是否需要更新。 - **Scheduler配置**:在...

    apache-solr-3.5.0.jar

    通过SolrJ,开发者可以方便地在Java应用程序中创建索引、执行查询、管理索引段和处理Solr服务器返回的结果。这个库使得在Java环境中集成Solr变得简单,无需直接操作HTTP请求。 在搭建Solr全文检索环境时,你需要做...

    solr-dataimporthandler的jar包

    Solr 数据导入处理器(DataImportHandler,DIH)是 Apache Solr 的一个重要组件,它允许用户从各种数据源,如关系型数据库、CSV 文件等,批量导入数据到 Solr 索引中。这个功能极大地简化了数据同步和更新的过程,...

    solr6--solr-dataimporthandler-scheduler-1.1

    在Solr6版本中,DataImportHandler(DIH)是一个非常重要的特性,它允许Solr从外部数据源导入数据并建立索引。在"solr6--solr-dataimporthandler-scheduler-1.1"这个项目中,我们关注的重点是DIH的调度功能,也就是...

    Apache Solr(solr-8.11.1.tgz)

    它包括一个默认的配置集,以及一个简单的数据导入处理程序(DIH)示例,帮助开发者了解如何设置和使用Solr。 5. **docs 目录**:包含了Solr的文档,包括用户手册、API参考和教程,对于学习和调试Solr非常有用。 6....

    最新版linux solr-8.8.2.tgz

    Solr 提供了一个内置的管理界面,可以通过浏览器访问 `http://localhost:8983/solr/` 来查看核心状态、执行查询和管理索引。 9. **优化与更新**: 随着数据的增长和变化,可能需要对索引进行优化以提高搜索性能。...

    solr(solr-9.0.0.tgz)

    然后可以通过POST请求将数据导入Solr,Solr会自动进行分词、建立倒排索引等操作,从而实现快速的全文检索。 Lucene是Solr的核心搜索引擎库,它提供了基本的搜索功能,如倒排索引、TF-IDF评分等。而Solr则在其基础上...

    solr-7.4.0.zip

    4. `example`目录:提供了一个简单的Solr示例,包括一个预配置的Solr实例,可以快速启动并开始使用Solr。 5. `docs`目录:包含了Solr的文档,包括用户手册、API参考等。 6. `contrib`目录:包含了一些社区贡献的模块...

    solr(solr-9.0.0-src.tgz)源码

    - `SolrCore`: 代表Solr的单一索引实例,包含了索引、查询和其他核心功能。 - `SolrRequestHandler`: 处理Solr请求的接口,用于定义不同的查询和更新处理逻辑。 - `UpdateRequestProcessorChain`: 更新请求处理链...

    支持solr6.1-solr-dataimport-scheduler-1.2.jar

    `Solr DataImportHandler`(DIH)是 Solr 内置的一个功能,用于从关系型数据库或其他数据源导入数据,并建立索引。DIH 提供了全量和增量数据导入的功能,使得 Solr 能够保持与源数据的同步。`solr-dataimport-...

    solr6.5.1定时增量apache-solr-dataimportscheduler

    DataImportHandler(DIH)是一个强大的工具,允许Solr与各种数据源进行交互,将这些数据转换为Solr可以理解的格式,然后索引到Solr中。它支持全量导入和增量导入,全量导入是重新导入所有数据,而增量导入则只导入自...

    solr-import-export-json最新代码

    solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-...

    solr-dataimporthandler.rar

    它们是DIH的核心,负责解析配置、执行SQL查询、转换数据并将其导入到Solr索引中。 3. **solr-dataimporthandler-extras-8.9.0.jar:** 这个额外的JAR文件包含了一些扩展的DIH功能,如对特定数据库的支持、自定义...

    solr定时自动同步数据库需要用到的apache-solr-dataimportscheduler.jar包

    这个插件使我们能够设置定时任务,定期从数据库中抓取新的或更新的数据并导入到Solr索引中,从而保持索引与数据库的同步。 描述中提到了该插件适用于Solr 7.7.2版本,并且已经包含了账号密码验证功能。这意味着在...

    solr-4.9.0-安装部署文档

    - 配置 Solr 的 Data Import Handler(DIH)以连接 MySQL 数据库,这涉及到修改 Solr 的配置文件,如 managed-schema 或 schema.xml,以及在 Solr 的 DataConfig.xml 中定义数据源和查询语句。 完成以上步骤后,你...

    mmseg4j-solr-2.4.0.jar

    本文将深入探讨mmseg4j在Solr中的应用,以及如何在Solr 6.3版本中集成并使用mmseg4j-solr-2.4.0.jar这个库。 首先,mmseg4j是由李智勇开发的一个基于Java的中文分词工具,它的全称是“Minimum Match Segmentation ...

    solr-dataimportscheduler-1.1.1.jar

    同时,还需要在Solr的配置文件中进行相应的设置,比如定义数据源、指定增量字段等,以指示插件如何与数据库或其他数据源交互,并确定哪些数据需要进行增量更新。 数据源的配置通常在`data-config.xml`文件中完成,...

Global site tag (gtag.js) - Google Analytics