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
>
<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
>
<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
>
<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"
/>
<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;
-
-
-
-
-
-
-
-
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"
);
-
}
-
}
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 {
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的环境变量,后来删掉也能用了,暂不知道是什么原因,不知它存哪去了
分享到:
相关推荐
使用 DIH,我们可以将数据从 Oracle 数据库中提取出来,然后将其插入 Solr 索引库中。 增量索引 增量索引是指将新添加或更新的数据插入 Solr 索引库中,一般用于批量更新数据的情况。在这种情况下,我们需要将新...
本Demo将展示如何使用Solr 7.4与MySQL数据库集成,实现数据导入,并结合IK分词器提升中文搜索体验。 首先,你需要下载并安装Solr 7.4.0。解压压缩包`solr-7.4.0`,这是一个包含Solr服务器和配置文件的完整包。在`...
### Lucene与Solr的使用详解 #### 一、Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,由Java语言编写而成。它能够为应用系统提供强大的全文检索能力,是当前最为流行的开源搜索库之一。由于其高度可...
**LUCENE索引搜索数据库技术汇总** Lucene是一个高性能、全文检索库,它是Apache软件基金会的顶级项目,被广泛应用于各种搜索引擎的开发。在学习和应用Lucene的过程中,掌握其核心概念和技术至关重要。以下是对...
《跟益达学Solr5之从MySQL数据库导入数据并索引》这篇文章主要探讨了如何使用Apache Solr 5从MySQL数据库中导入数据并建立索引,以便进行高效的全文搜索。Solr是一款强大的开源搜索服务器,它提供了丰富的查询语言、...
### 使用Lucene Solr搭建Oracle数据库全文搜索服务 #### 一、基础知识介绍 - **Lucene**: 是一个高性能、全功能的全文检索引擎库。它为开发者提供了构建搜索应用程序所需的工具,但不提供完整的搜索应用。 - **...
尽管Solr主要用于文本搜索和索引,但在实际应用中,它通常会与其他数据库系统配合使用。例如,在电商系统中,商品的基本信息(如名称、价格、库存等)通常存储在关系型数据库(如MySQL)中,而商品的描述、评论等...
【知识点详解】 1. **Lucene简介** Lucene是一个高性能、全文本搜索库,由Apache...总之,使用Lucene对数据库进行索引可以显著提升全文搜索的效率,但需要注意索引维护和性能优化,以确保系统的稳定性和响应速度。
CDH 使用 Solr 实现 HBase 二级索引 在大数据处理中,HBase 是一种流行的 NoSQL 数据库,用于存储大量的数据。然而,在查询和检索数据时,HBase 的性能可能不太理想。这是因为 HBase 是基于 Key-Value 的存储方式,...
Solr使用Lucene库作为其核心的索引引擎。索引是通过将文档转换为一系列可搜索的字段来创建的,这些字段包括文本、数字、日期等。索引存储在磁盘上,并且可以被优化以提高查询性能。 2. **增量更新的概念** 增量...
7. **维护与更新**:为了保持索引与数据库的一致性,需要监听数据库的变化,如新增、修改或删除记录,及时更新Lucene索引。可以设置定时任务或触发器来实现这一过程。 在实际应用中,可能还需要考虑如错误处理、...
Solr查询与索引是Apache Solr的核心功能,它是一个基于Lucene的开源搜索引擎服务器,提供了高效、可扩展的全文检索、命中高亮、 faceted search(分面搜索)、拼写检查、动态集群等特性。在本文中,我们将深入探讨...
Solr是由Apache Lucene项目维护的搜索平台,其核心功能包括文本分析、索引和搜索,以及结果排序和高亮显示。它支持多种数据源,如文件、数据库等,并提供了RESTful API,便于集成到各种Web应用程序中。 2. **索引...
《基于Solr4.9.0的搜索系统:探索索引构建与查询接口》 在当前的信息化时代,搜索引擎已经成为互联网应用不可或缺的一部分。本项目基于Apache Solr 4.9.0版本,构建了一个功能完善的搜索系统,结合了SpringBoot、...
8. ElasticSearch 和 Solr 的区别:ElasticSearch 和 Solr 都是基于 Lucene 实现的,全文检索引擎,但是 Solr 在实时建立索引的时候会产生 IO 阻塞查询性能会比 ElasticSearch 差一些,ElasticSearch 支持分布式,...
在Solr中,有时我们需要与传统的关系型数据库如SQL Server或Oracle进行交互,以获取数据或者同步数据库中的信息到Solr索引中。本文将详细介绍如何在Solr中建立与SQL Server和Oracle的连接,并解决可能出现的连接问题...
Solr 4.7 是一个流行的全文搜索引擎,它允许用户通过数据导入处理器(DataImportHandler, DIH)从关系型数据库如 SQL Server 导入数据并建立索引,以实现快速搜索。在这个教程中,我们将深入理解如何在 Solr 4.7 中...