一、准备环境
1、一台linux服务器(Centos7)
2、安装jdk8环境
3、准备solr7.8安装包
二、安装(我这里使用的是solr自带的应用容器,也可以集成到tomcat)
1)从官网下载最新solr
wget http://mirrors.shuosc.org/apache/lucene/solr/7.4.0/solr-7.4.0.tgz
2)解压,安装
tar -zxvf solr-7.2.0.tgz
3)相关命令
bin/solr stop -all 关闭solr服务
bin/solr start -force 开启solr服务
bin/solr status 查看solr服务状态
三、使用solr
1、点击Core Admin
2、按照步骤去创建,然后点击确认会出现
3、这个错误是因为找不到对应的配置文件,进入server/solr/configsets/_default/直接把里面的conf 复制到 你新建的core中 你新建的core在server/solr目录下
命令如下:
1、进入到server/solr/configsets/_default下
cd /usr/local/install/solr7.4.0/server/solr/configsets/_default/
2、然后复制到新建的test中
cp -r conf /usr/local/install/solr7.4.0/server/solr/test/
3、到这儿core已创建好,相应的操作可以去网上寻找,我在这就不详细说明
三、连接mysql数据库
1)首先处理jar
mysql-connector-java-x.x.x.jar solr-dataimporthandler-extras-5.1.0.jar solr-dataimporthandler-7.1.0.jar
拷贝到 solr\server\solr-webapp\webapp\WEB-INF\lib 下
1)配置连接信息
找到你新建的 core 下的solrconfig.xml文件(solrconfig.xml 文件所在目录是: solr\server\solr\test\conf),打开找到第一个requestHandler,在他下面加入如下内容
<requestHandler name="/dataimport"
class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
再在你创建的core目录的conf下创建data-config.xml文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.105:3306/solr"
user="root"
password="root" />
<document>
<entity name="person" query="select * from user">
<field column="ID" name="id" />
<field column="name" name="name" />
<field column="passward" name="passward" />
</entity>
</document>
</dataConfig>
dataSource不多说,一看就明白,
entity --代表数据库表,column--代表数据库表字段,name--代表solr中字段名
(注意:创建这个文件的时候第一行不能有空格或者空行,否则报错)
在managed-schema文件中添加对应于数据库字段的field,建议在 solr 可视化界面操作。当然,一定要手动修改 managed-schema 文件也不是不可以,但是每次更改完需要重新加载 Core,或者粗暴一点直接重新启动solr也可以。那么,直接修改 managed-schema 文件的。到这里你应该能联系上数据库了,也可以导入数据了。
三、在java中的应用
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.3.1</version>
</dependency>
一个测试小例子:
package com.hzl.admin.api.test;
import com.hzl.admin.core.entity.User;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import java.io.IOException;
import java.util.List;
public class SolrTest {
//指定solr服务器的地址
private final static String SOLR_URL = "http://192.168.1.253:8983/solr/";
/**
* 创建SolrServer对象
* <p>
* 该对象有两个可以使用,都是线程安全的
* 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的
* 2、 EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了
* 3、solr 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
*
* @return
*/
public HttpSolrClient createSolrServer() {
HttpSolrClient solr = null;
solr = new HttpSolrClient(SOLR_URL);
return solr;
}
/**
* 往索引库添加文档
*
* @throws IOException
* @throws SolrServerException
*/
public void addDoc() throws SolrServerException, IOException {
//构造一篇文档
SolrInputDocument document = new SolrInputDocument();
//往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
document.addField("id", "8");
document.addField("name", "周新星");
document.addField("password", "646456");
//获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + "test");
solr.add(document);
solr.commit();
solr.close();
}
/**
* 根据id从索引库删除文档
*/
public void deleteDocumentById() throws Exception {
//选择具体的某一个solr core
HttpSolrClient server = new HttpSolrClient(SOLR_URL + "test");
//删除文档
server.deleteById("1");
//删除所有的索引
//solr.deleteByQuery("*:*");
//提交修改
server.commit();
server.close();
}
/**
* 查询
*
* @throws Exception
*/
public void querySolr() throws Exception {
HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL + "test/");
SolrQuery query = new SolrQuery();
// 下面设置solr查询参数
// 参数q 查询所有
// query.set("q", "*:*");
// 相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来 ,这个作用适用于联想查询
query.set("q", "name:ha~ OR password:ha~");
// 参数fq, 给query增加过滤查询条件
// id为0-4
query.addFilterQuery("id:[32 TO 65]");
// 给query增加布尔过滤条件
// query.addFilterQuery("description:演员"); // description字段中含有“演员”两字的数据
// 参数df,给query设置默认搜索域
query.set("df", "name");
// 参数sort,设置返回结果的排序规则
query.setSort("id", SolrQuery.ORDER.desc);
// 设置分页参数
query.setStart(0);
// 每一页多少值
query.setRows(10);
// 参数hl,设置高亮
query.setHighlight(true);
// 设置高亮的字段
query.addHighlightField("name");
// 设置高亮的样式
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
// 获取查询结果
QueryResponse response = solrServer.query(query);
// 两种结果获取:得到文档集合或者实体对象
// 查询得到文档的集合
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("通过文档集合获取查询的结果");
System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound());
// 遍历列表
for (SolrDocument doc : solrDocumentList) {
System.out.println("id:" + doc.get("id") + " name:" + doc.get("name") + " password:" + doc.get("password"));
}
// 得到实体对象
List<User> tmpLists = response.getBeans(User.class);
if (tmpLists != null && tmpLists.size() > 0) {
System.out.println("通过文档集合获取查询的结果");
for (User per : tmpLists) {
System.out.println("id:" + per.getId() + " name:" + per.getUserName() + " password:" + per.getPassword());
}
}
}
public static void main(String[] args) throws Exception {
SolrTest solr = new SolrTest();
//solr.createSolrServer();
// solr.addDoc();
// solr.deleteDocumentById();
solr.querySolr();
}
}
到这里,你应该有点兴奋了,经过努力实现了简单运用solr。后续考虑在tomcat运行,实现定时增量导入,以及在java中更详尽的应用。