Solr配置
Solr的主要功能是全文检索,该功能分为两个过程:创建索引和对索引进行搜索;
在创建索引之前,需要重点关注两个配置文件:SOLR_HOME/collection1/conf/schema.xml(定义Document的结构类似定义DB的表结构) & solrconfig.xml(solr运行配置如请求如何被处理);在Solr创建索引的过程中,每条数据被抽象成一个Document(文档),每条数据的属性被抽象成Field(字段),Solr原生支持XML,JSON,CSV格式的Document文件对Document进行添加,删除;但现实情况是很多应用的数据都保存在关系型数据库或者XML文件中,要想对这些数据进行索引需要通过Data Import Request Handler(Solr扩展模块),该模块提供全量索引(将全部数据进行索引)和增量索引(只对某个时间点之后的数据进行索引)功能;
下面笔者将通过一个对MySQL数据库中数据进行索引的例子来阐述整个过程;
1,对数据表topic中的数据创建索引,topic表结构如下:
CREATE TABLE `topic` (
`id` INT(8) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`title` VARCHAR(50) DEFAULT NULL COMMENT '标题',
`content` TEXT COMMENT '内容',
`create_date` BIGINT(15) DEFAULT NULL COMMENT '创建时间',
`update_date` BIGINT(15) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
) ENGINE=INNODB CHARSET=utf8
`id` INT(8) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`title` VARCHAR(50) DEFAULT NULL COMMENT '标题',
`content` TEXT COMMENT '内容',
`create_date` BIGINT(15) DEFAULT NULL COMMENT '创建时间',
`update_date` BIGINT(15) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
) ENGINE=INNODB CHARSET=utf8
全文检索只针对title,content字段进行其他字段只做显示;
2,定义Document(文档)结构,对SOLR_HOME/collection1/conf/schema.xml进行如下修改:
在<fields>中添加如下field定义:
<!-- 定义文档Field对应于topic表字段-->
<field name="test_id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="test_title" type="text_chinese_IK" indexed="true" stored="true" />
<field name="test_content" type="text_chinese_IK" indexed="true" stored="true" />
<field name="test_create_date" type="long" indexed="false" stored="true" />
<field name="test_update_date" type="long" indexed="false" stored="true" />
field属性说明:
name:必须,field名称
type:必须,field类型名称,在<types>中通过fieldType定义
indexed:true表示该field需要被索引(能搜索和排序)
stored:true表示在索引中保存该field可在后面被读取
multiValued:true表示该field在文档中存在多个值
required:field是否必须有值,如果索引过程中该field为空则出错
default:默认值
增加fieldType定义,因为要支持中文检索,建索引时需要使用中文分词包,笔者使用的是IK Analyzer,下载IK Analyzer 2012FF_hf1版本能支持Solr4,上述配置中使用了type="text_chinese_IK" fieldType,该fieldType并非Solr预定义类型,故需要在<types>中添加该类型的定义并支持中文分词,定义如下:
<fieldType name="text_chinese_IK" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer" />
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer" />
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer" />
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
org.wltea.analyzer.lucene.IKAnalyzer为中文分词类同时用于索引和搜索过程,在这里需要将IK Analyzer中的IKAnalyzer2012FF_u1.jar,stopword.txt,IKAnalyzer.cfg文件复制到TOMCAT_HOME/webapp/solr/WEB-INF/lib下面
设置uniqueKey,每个文档可通过uniqueKey进行定位,Solr保证一个uniqueKey只存在一个Document:
<uniqueKey>test_id</uniqueKey>(作为uniqueKey的field必须是required)
3,添加dataimporter处理器,Solr REST风格的APIs保证所有的功能都可通过HTTP请求实现,如查询/select,索引更新/update等以上功能已在Solr上预定义,dataimporter属于扩展功能,需要在SOLR_HOME/collection1/conf/solrconfig.xml中添加Data Import Request Handler,如本例:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">./data-config.xml</str>
</lst>
</requestHandler>
<lst name="defaults">
<str name="config">./data-config.xml</str>
</lst>
</requestHandler>
org.apache.solr.handler.dataimport.DataImportHandler为DataImporter处理器(扩展模块),需要将Solr-4.2.0/dist/solr-dataimporthandler-4.2.0.jar,solr-dataimporthandler-extras-4.2.0.jar复制到TOMCAT_HOME/webapps/solr/WEB-INF/lib中,data-config.xml为数据源配置文件,DataImporter使用该文件从数据源中读取数据
4,配置data-config.xml,本例从MySQL表topic中导入数据:
<dataConfig>
<dataSource type="JdbcDataSource"
batchSize="-1"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/test"
user="reader"
password="reader"/>
<document>
<entity name="topic" pk="id" onError="Skip" transformer="com.zj.transformer.MySolrTransformer"
<dataSource type="JdbcDataSource"
batchSize="-1"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/test"
user="reader"
password="reader"/>
<document>
<entity name="topic" pk="id" onError="Skip" transformer="com.zj.transformer.MySolrTransformer"
query="select id,title,content,create_date,update_date from topic"
deltaImportQuery="select id,title,content,create_date,update_date from topic where id=${dataimporter.delta.id}"
deltaImportQuery="select id,title,content,create_date,update_date from topic where id=${dataimporter.delta.id}"
deltaQuery="select id from topic where update_date>'${dataimporter.last_index_time}'">
<field column="id" name="test_id" />
<field column="title" name="test_title" />
<field column="content" name="test_content" />
<field column="create_date" name="test_create_date" />
<field column="id" name="test_id" />
<field column="title" name="test_title" />
<field column="content" name="test_content" />
<field column="create_date" name="test_create_date" />
<field column="update_date" name="test_update_date" />
</entity></document>
</dataConfig>
<dataSource>用于定义数据源,本例定义JdbcDataSource作为数据源
<entity>定义抽取,转换并将数据添加进索引,name为名称,pk为主键,onError定义出错处理方式(abort|skip|continue),transformer用于数据转换(query执行后,添加进索引前),query定义全量索引时数据查询SQL,deltaImportQuery定义增量索引时数据查询SQL,deltaQuery定义哪些数据需要增量索引的查询SQL
<field>定义将数据库列对于到Solr的索引字段,column为数据库表字段名,name为Solr定义的索引字段名
本例中query="select id,title,content,create_date,update_date from topic",全量索引将topic表中的所有数据都添加到Solr索引中,在全量索引完成之后,Solr会自动生成dataimport.properties保存最近一次索引开始时间戳last_index_time,通过配置deltaImportQuery="select id,title,content,create_date,update_date from topic where id=${dataimporter.delta.id}",deltaQuery="select id from topic where update_date>'${dataimporter.last_index_time}'",增量索引将topic中update_date大于last_index_time的数据添加进索引实现增量更新(注:${dataimporter.delta.id},${dataimporter.last_index_time}是固定写法除id需要跟deltaQuery="select id ..."对应外其他不可更改要不然DataImporter取不到相应的值);
本例的com.zj.transformer.MySolrTransformer主要是为了介绍transformer,并无特殊目的:
package com.zj.transformer;
public class MySolrTransformer {
public Object transformRow(Map<String, Object> row) {
// row中保存数据库查询出的一条记录<column_name, value>
// 可以对row进行各种修改
return row;
}
}
transformer的定制非常简单完全是无侵入式的,只需要实现public Object transformRow(Map<String, Object> row)方法即可
5,启动索引过程
建全量索引,在浏览器中输入:http://ip:port/solr/dataimport?command=full-import&commit=true
建增量索引:http://ip:port/solr/dataimport?command=delta-import&clean=false&commit=true(也可通过定时器定时发送HTTP请求建增量索引);
6,查询索引
1,直接通过Solr查询页面查询:http://ip:port/solr/#/collection1/query
2,通过Solrj API进行查询:将Solr-4.2.0/dist/solr-solrj-4.2.0.jar,Solr-4.2.0/dist/solrj-lib/httpclient-4.2.3.jar,httpcore-4.2.2.jar,httpmime-4.2.3.jar Copy到工程的classpath中,创建如下代码:
package com.mobcent.searcher.solr.searcher;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
public class CopyOfSolrSearcher {
public static void main(String[] args) {
SolrServer server = new HttpSolrServer("http://127.0.0.1:8080/solr" );
((HttpSolrServer) server).setSoTimeout(3000);
((HttpSolrServer) server).setConnectionTimeout(3000);
((HttpSolrServer) server).setMaxTotalConnections(100);
((HttpSolrServer) server).setDefaultMaxConnectionsPerHost(100);
SolrQuery query = new SolrQuery();
//set keyword
query.setQuery( "keyword" );
//set filter.
query.addFilterQuery( "field:value" );
//set form to.
//起始页
query.setStart(0);
//每页
query.setRows(10);
QueryResponse queryResponse;
try {
queryResponse = server.query(query);
SolrDocumentList docList = queryResponse.getResults();
if (null != docList)
System. out .println("Find Total: " + docList.getNumFound());
} catch (SolrServerException e) {
e.printStackTrace();
}
}
}
总结,以上通过一个具体的例子对Solr进行配置,走完了使用Solr的整个流程,创建索引,对索引进行搜索;顺便说一句,Solr的Wiki是个不错的学习Solr的好地方;
相关推荐
Apache Solr 是一个开源的全文搜索引擎,由Apache软件基金会维护,是Lucene项目的一部分。它提供了高效、可扩展的搜索和导航功能,广泛应用于企业级的搜索应用中。Solr-8.11.1是该软件的一个特定版本,包含了最新的...
Apache Solr是一款开源的企业级搜索平台,由Apache软件基金会维护。它是基于Java的,提供了高效、可扩展的全文检索、数据分析和分布式搜索功能。Solr-8.11.1是该软件的一个特定版本,包含了从早期版本到8.11.1的所有...
这份指南旨在指导用户安装、配置和使用Apache Solr。 从描述中,我们可以得知这份官方文档详细介绍了安装步骤、Schema配置、solrConfig配置、以及管理界面的使用方法。文档的标签"apache solr solr4.5"明确指出了...
"Apache Solr High Performance"可能涵盖了如何最大化Solr的性能,包括优化索引构建过程、查询性能调优、内存管理策略以及硬件配置建议。这本书可能会讨论以下关键点: 1. **索引优化**:介绍如何通过字段类型选择...
Apache Solr 是一个开源的企业级搜索平台,由Apache软件基金会维护。版本3.6.1是Solr的一个重要里程碑,提供了稳定性和性能优化。通过深入理解这个版本的源代码,开发者可以更深入地掌握Solr的工作原理,从而更好地...
#### 安装与配置Apache Solr - **使用Jetty进行安装**:首先下载并解压Solr,然后进入Solr目录下的example文件夹,通过执行`java -jar start.jar`(假设已安装Java 1.5及以上版本)启动Jetty服务器。之后,可以通过...
### Apache Solr Guide 4.7 知识点解析 #### 一、Apache Solr 概述 **Apache Solr** 是一个高性能、基于 Lucene 的全文检索服务系统,广泛应用于互联网企业的搜索服务中。Solr 提供了高度可扩展且稳定的搜索功能,...
- **高可用性与集群配置**:深入探讨如何构建高可用性的Solr集群,包括数据复制、负载均衡以及故障转移机制等关键概念和技术实践。 - **性能调优**:从硬件选型到软件参数设置,全面覆盖Solr性能优化的各种策略,如...
Apache Solr 是一款开源的企业级搜索服务器,由Apache软件基金会维护。它被广泛应用于构建高效、可扩展的全文检索应用。本部分中文翻译主要涵盖了Solr的快速入门、Schema设计和文本分析以及索引与搜索的基本操作。 ...
《Apache Solr 7官方指南》这本书将详细讲解上述所有功能,同时包含安装、配置、索引构建、查询优化、集群管理和故障排查等方面的指导,是学习和使用Solr 7不可或缺的参考资料。无论你是初次接触Solr的新手,还是...
Apache Solr是一款强大的开源搜索引擎,基于Java开发,与Apache Lucene库紧密集成。它提供了高效、可扩展的全文检索、命中高亮、拼写检查、分类、 faceting、实时索引和多语言支持等特性。在商业环境中,Solr常用于...
这个漏洞出现在Apache Solr的默认配置中,官方并未认为这是一个安全问题,因此没有提供修复。攻击者可以通过发送特定的HTTP请求来触发任意文件读取。首先,攻击者需要发送一个JSON格式的请求,设置`...
Apache Solr DataImportScheduler 是一个用于 Apache Solr 的插件,它允许用户安排数据导入任务,从而实现定期从外部数据源(如数据库或文件系统)更新索引。这个插件对于那些需要实时或近乎实时数据搜索的应用场景...
Apache Solr 是一个开源的全文搜索引擎,由Apache软件基金会维护,是Lucene项目的一部分。它提供了高效、可扩展的搜索和分析能力,广泛应用于企业级的搜索应用中。标题中的"solr-8.11.1-src.tgz"表明这是Apache Solr...
### Apache Solr 3.1 Cookbook 知识点解析 #### 一、Apache Solr 3.1 简介 - **定义**: Apache Solr 是一个基于 Lucene 的高性能、可扩展的企业级搜索服务器。它支持高度动态的索引和搜索能力,能够处理大量数据并...
1. **配置Solr服务器**:首先,将`apache-solr-dataimportscheduler-1.0.jar`添加到Solr服务器的`lib`目录下,确保服务器启动时能加载这个库。 2. **添加Scheduler配置**:在Solr的配置文件`solrconfig.xml`中,你...
这个名为"apache-solr-3.5.0.jar"的压缩包包含两个关键组件:`apache-solr-core-3.5.0.jar`和`apache-solr-solrj-3.5.0.jar`,它们对于成功搭建Solr 3.5.0环境至关重要。 1. `apache-solr-core-3.5.0.jar`: 这是...
Apache Solr 是一个开源的全文搜索引擎,广泛应用于各种企业级数据搜索和分析场景。增量更新是Solr的一个关键特性,它允许系统仅处理自上次完整索引以来发生更改的数据,从而提高了性能并降低了资源消耗。"apache-...