`

用solr从数据库建立中文Lucene索引

阅读更多
用solr从数据库建立中文Lucene索引
参照: Solr tutorial
Index a DB table directly into Solr
Data Import Handler
使用solr搭建你的全文检索

Solr是一个基于Lucene java库的企业级搜索服务器,运行在Servlet容器中。
1.  下载solr: http://www.apache.org/dyn/closer.cgi/lucene/solr/
    当前最新版是1.4
    解压到一个目录中,假设是solrpath
2.  添加Handler
    编辑solrpath/example/solr/conf文件夹下的solrconfig.xml文件,在config元素中添加
   
    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">
          <str name="config">data-config.xml</str>
        </lst>
    </requestHandler>
    


3.  在此文件夹中新建一个data-config.xml文件,内容如下
    detail列是一个clob类型的,要用到ClobTransformer,这是1.4版本中才有的
    column="DETAIL" clob="true"中的列名DETAIL一定要大写,要不会不起作用
<dataConfig>
  <dataSource type="JdbcDataSource" 
              driver="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost/dbname" 
              user="user-name" 
              password="password"/>
  <document>
    <entity name="myentyty" transformer="ClobTransformer"
        query="select id, title, detail from mytable">
        <field column="DETAIL" clob="true"/>
    </entity>
  </document>
</dataConfig>


4.  修改schema.xml,找到<fieldType name="text",将分词器修改为中文分词器,这里用的是包装过的Paoding分词,这个东西好像已经不更新了,以后看看IKAnalyzer吧。
    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">  
       <analyzer type="index">  
           <tokenizer class="net.paoding.analysis.analyzer.ChineseTokenizerFactory" mode="most-words"/>  
           <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>  
           <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>  
           <filter class="solr.LowerCaseFilterFactory"/>  
           <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>  
       </analyzer>  
       <analyzer type="query">  
           <tokenizer class="net.paoding.analysis.analyzer.ChineseTokenizerFactory" mode="most-words"/>                  
           <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>  
           <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>  
           <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>  
           <filter class="solr.LowerCaseFilterFactory"/>  
           <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>  
       </analyzer>  
   </fieldType>


   原来的schema.xml中没有的字段自己添加上。schema.xml默认是UTF-8编码,添加中文注释要在UTF-8编码下添加,要不会报错的
  
   <field name="detail" type="text" indexed="true" stored="true" />
   <!-- 添加到默认的查询字段,可根据需要修改 -->
   <copyField source="title" dest="text"/>
   <copyField source="detail" dest="text"/>


5.  包装Paoding的分词器
package net.paoding.analysis.analyzer;

import java.io.Reader;
import java.util.Map;

import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;
import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;
import net.paoding.analysis.knife.PaodingMaker;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.solr.analysis.BaseTokenizerFactory;

/**
 * Created by IntelliJ IDEA. 
 * User: ronghao 
 * Date: 2007-11-3 
 * Time: 14:40:59 中文切词 对庖丁切词的封装
 */
public class ChineseTokenizerFactory extends BaseTokenizerFactory {
	/**
	 * 最多切分 默认模式
	 */
	public static final String MOST_WORDS_MODE = "most-words";
	/**
	 * 按最大切分
	 */
	public static final String MAX_WORD_LENGTH_MODE = "max-word-length";

	private String mode = null;

	public void setMode(String mode) {
		if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode) || "default".equalsIgnoreCase(mode)) {
			this.mode = MOST_WORDS_MODE;
		} else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {
			this.mode = MAX_WORD_LENGTH_MODE;
		} else {
			throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode);
		}
	}

	@Override
	public void init(Map<String, String> args) {
		super.init(args);
		setMode(args.get("mode"));
	}

	public Tokenizer create(Reader input) {
		return new PaodingTokenizer2(input, PaodingMaker.make(), createTokenCollector());
	}

	private TokenCollector createTokenCollector() {
		if (MOST_WORDS_MODE.equals(mode))
			return new MostWordsTokenCollector();
		if (MAX_WORD_LENGTH_MODE.equals(mode))
			return new MaxWordLengthTokenCollector();
		throw new Error("never happened");
	}
}


因为新版本的接口可能是变了,还需要对PaodingTokenizer类修改一下,原来是继承TokenStream类,改为继承Tokenizer

public final class PaodingTokenizer2 extends Tokenizer implements Collector {


这两个修改的类就放在solr.war中,在压缩包的WEB-INF文件夹中新建classes文件夹,将这两个类连同包层次复制进去就行

6.  将Paoding和数据库驱动放到lib中,进入solrpath/example目录中运行命令
    java -jar start.jar
    进入浏览器,运行
    http://localhost:8983/solr/dataimport?command=full-import
    导入成功后,运行
    http://localhost:8983/solr/admin/
    在搜索框中输入搜索内容进行查询

还有个Paoding的词典文件的问题,一开始是建了个PAODING_DIC_HOME的环境变量,后来删掉也能用了,暂不知道是什么原因,不知它存哪去了
5
1
分享到:
评论
1 楼 q137163819 2011-10-11  
[b][/b][i][/i][u][/u]
引用

    [*]
[img][/img][size=xx-small][/size]

相关推荐

    solr 企业搜索引擎教程

    某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此 外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用 Solr 创建的索引 Solr 的特性包括:  高级的全文搜索功能  专为高通量...

    apache solr1.3.0所有最新开发包及源码及文档

    ——为了更容易索引数据库内容到Solr,建立新的DataImportHandler。 关于Apache Solr: Solr是一个基于Lucene Java搜索库的开源企业搜索服务器,拥有XML/HTTP和JSON APIs,点击高亮显示,多侧面搜索,缓存,复制...

    apache solr1.3.0开发包源码及文档

    Apache Solr 1.3.0发布,Apache Solr是一个性能强大的,基于 Lucene 的全文搜索的 开源企业级搜索服务器,拥有XML/HTTP,JSON APIs,hit highlighting, ...新的DataImportHandler提供简易方式索引数据库内容进入Solr

    开源企业搜索引擎SOLR的应用教程.pdf

    定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述所有 Field 及其内容的 XML 文档就可以了。定制搜索的时候只需要发送 HTTP GET 请求即可,然后对 Solr 返回的信息进行重新布局,以产生利于...

    浅谈MySQL和Lucene索引的对比分析

    MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr、ElasticSearch)的核心类库。两者的索引(index)有什么区别呢?以前写过一篇《Solr与MySQL查询性能对比》,...

    开源企业搜索引擎SOLR的应用教程

    定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述所有 Field 及其内容的 XML 文档就可以了。定制搜索的时候只需要发送 HTTP GET 请求即可,然后对 Solr 返回的信息进行重新布局,以产生利于...

    Hbase 二级索引方案

    Solr 是一个独立的企业级搜索应用服务器,是 Apache Lucene 项目的开源企业搜索平台, 其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如 Word、PDF)的处理。Solr 是高度可扩展的...

    solr:Allegro Common Lisp与Solr的接口

    Solr是来自Apache Lucene项目的开源自由文本索引/搜索平台。 有关详细信息,请参见以下URL。 该软件包允许Allegro CL应用程序与正在运行的Solr服务器通信,添加和删除文档以及运行查询以检索索引记录。 该软件包...

    Lucene全文检索框架+Solr+ElasticSearch搜索引擎(Java高级必备.ES)

    6、将数据库中的数据导入至Solr索引库 7、通过Solr后台管理界面对索引进行CRUD高亮过滤排序分页 8、通过Solrj实现索引的添加更新 9、通过Solrj实现索引的删除 10、索引的检索_过滤_高亮等操作 11、项目实战应用...

    solr-7.7.1

    Solr是一个独立的企业级搜索应用服务器,基于Lucene。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。它可对外提供类似于Web-service的API接口。用户可以...

    开源企业搜索引擎Solr的应用教程.doc

    适合于对数据库驱动的应用数据进行索引,尤其是替代传统的like ‘%expression%’来实现对varchar或clob等字段的索引,对于实现站内搜索是一种值得采纳的方案。但在分布式处理、接口封装上尚需要自己进行一定程度的...

    自己动手写搜索引擎(罗刚著).doc

    8.1.1 Solr服务器端的配置与中文支持 232 8.1.2 把数据放进Solr 237 8.1.3 删除数据 240 8.1.4 客户端搜索界面 241 8.1.5 Solr索引库的查找 242 8.1.6 索引分发 246 8.1.7 Solr搜索优化 246 8.1.8 Solr中字词混合...

    scrutineer:将经过排序的真值来源与另一种来源进行比较,以找到不匹配的地方。 设计用于验证诸如ElasticSearch和Solr之类的索引是否与其数据源(通常是数据库)同步

    在很多情况下,人们使用Solr / ElasticSearch / Compass对其中央数据库,mongodb,hbase等进行索引,因此索引是数据的辅助存储。 您怎么知道您的索引是否正确? 您是否可以随时重新索引5亿个文档? (这就是外星人...

    FileIndex:为给定目录中的所有文件编制索引的程序。 Java 中的第一个

    初始版本允许使用 MySQL 数据库进行文件索引。 结果证明这非常耗时,搜索速度慢得要命。 另一个主要问题是只能找到准确的文件名。 作为解决方案,我已转向 Apache Lucene - 支持 SolR 的引擎。 Lucene 进行语法...

    ist的matlab代码-typo3-mksearch:使用ZendLucene,ApacheSolr或ElasticSearch的通用的高度

    索引在数据级别进行(对应于数据库中的表。也可以在文件(例如PDF)中进行索引和搜索)。 搜索时,其优点是可以根据找到的数据记录的类型来设计输出。 您还可以最大程度地控制以后可以索引和查找哪些信息。 索引基本...

    ElasticSearch精讲.md

    ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,...据国际权威的数据库产品评测机构DBEngines的统计,在2016年1月,Elasticsearch已超过Solr等,成为排名第一的搜索引擎类

    ElasticSearch6.2.4最新实战教程.zip

    elasticsearch 6.x 实战教程 ElasticSearch是一个基于Lucene的搜索服务器。...据国际权威的数据库产品评测机构DBEngines的统计,在2016年1月,Elasticsearch已超过Solr等,成为排名第一的搜索引擎类应用

    PartaidetzaOn:电子参与开源平台

    PartaidetzaOn(电子参与...)创建项目的MYSQL数据库: $ mysql -u YOUR_MYSQL_USER -p -e "create database YOUR_DATABASE" $ bin/django syncdb安装Solr并创建索引: - Download solr from http://lucene.apache.or

    bleve_sourcegraph_blog:博客的 Markdown 和示例

    如果您已经在使用 Java/JVM,Lucene/Solr/Elasticsearch 生态系统非常棒,但我们问自己: What if we combined 50% of Lucene's text analysis components with an off-the-shelf KV store? 初步关注最常用的文本...

    mmdemo-dockerized:一套基于Docker的用于监视多个社交媒体平台的服务

    -Solr是基于Apache Lucene构建的流行,快速,开放源代码的企业搜索平台。 主要用于索引所收集的社交媒体项目。 -该服务包括两部分:1)REST API,用于提供对收集的社交媒体项目的访问并公开与之相关的若干统计信息...

Global site tag (gtag.js) - Google Analytics