了解
按照原有模式:web浏览器—>web服务器—>数据库(可以通过各个字段搜索 模糊匹配 like)(效率极低)—>提升效率—>web服务器—>solr服务 。
下载地址: https://www.apache.org/dyn/closer.lua/lucene/solr/8.5.0/solr-8.5.0.tgz
目录结构
bin:solr的运行脚本
contrib:solr的一些软件/插件,用于增强solr的功能。
dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
docs:solr的API文档
example:solr工程的例子目录:
server:solr 运行的 war 文件和core
licenses:solr相关的一些许可信息
安装
安装前你的linux中要有jdk。因为我的已经有的所以直接安装
上传后解压
tar -zxvf 压缩包.tgz
启动solr服务
切换到bin目录
cd /usr/local/solr-8.5.0/bin
启动服务:
./solr start -force
停止服务:
./solr stop -all
在外部访问
启动时遇到的问题
1024
解决方案:在linux系统中,当安装如elasticsearch、solr等应用时,linux系统会提示各种因各种限制
而导致安装失败
1、查看系统所有限制
命令: ulimit -a
解决:
a)先切换到root账号(注意,若没切换,操作是不成功的);
b)以root身份修改/etc/security/limits.conf文件,在最后添加
* hard nofile 65000
* soft nofile 65000
c)以root身份修改/etc/security/limits.conf文件,在最后添加
* hard nproc 65000
* soft nproc 65000
修改完启动还会有一个问题
- [WARN] * Your Max Processes Limit is currently 3806. It
should be set to 65000 to avoid opera
解决:
将/usr/solr-8.5.0/bin/solr.in.sh文件中,SOLR_ULIMIT_CHECKS设置为false,消除WARN
/# Settings for common system values that may cause operational imparement when system defaults are used.
/ # Solr can use many processes and many file handles. On modern operating systems the savings by leaving
/ # these settings low is minuscule, while the consequence can be Solr instability. To turn these checks off, set
/ # SOLR_ULIMIT_CHECKS=false either here or as part of your profile.
/ # Different limits can be set in solr.in.sh or your profile if you prefer as well.
/ #SOLR_RECOMMENDED_OPEN_FILES=
#SOLR_RECOMMENDED_MAX_PROCESSES=
SOLR_ULIMIT_CHECKS=false
然后启动就启动成功
使用
创建solr实例 core
创建solr core
注1:solr会在解压目录下的server/solr目录中自动创建与命名相同的文件夹
注2: 但创建会报错, 因为缺少必要的配置文件. 需要在解压目录下的server/solr/configsets/_default目录中复制conf文件夹, 并粘贴到刚刚创建的文件夹中. 然后重新点击add core.
选中创建好的core,点击schema——add field添加属性到core
solr数据库没有表的概念,不依赖于类,而独立存在,可以创建属性,所以数据添加的时候可以根据需要创建
因为没有表和类,不需要同名属性,所以命名为表名_属性名,这样就可以知道如何对标哪个表
选择documents,在document type中选择document builder,然后选择需要添加的属性,并且赋值,所有属性设置完毕后,点击submit添加
属性的添加时独立的,不需要考虑是哪个表
选择query,并设置相关查询要求进行查询
(中文)分词查询
进入需要设置中文分词的core的conf文件夹,变价solrconfig.xml文件,添加如下内容
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" regex="lucene-analyzers-smartcn-\d.*\.jar" />
编辑同文件夹中的managed-schema文件,添加内容如下
添加一个属性和分词定义
重启solr服务器solr.cmd stop -p 8983
启动solr.cmd start
在schema里添加一个file
选中刚刚添加进去的类型
可以去analysis进行测试
按照字符串进行匹配
按照自定义的类型匹配
数据导入
编辑solrconfig.xml文件,添加如下内容
<lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-extras-\d.*\.jar" />
将需要使用的数据库jdbc jar包添加到解压目录的server\solr-webapp\webapp\WEB-INF\lib
版本不重要
编辑solrconfig.xml文件,添加如下内容
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<!--datasorce config-->
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
在同目录下,添加data-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" name="userSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root" password="111111"/>
<document>
<entity name="user" pk="u_id" dataSource="userSource"
query="SELECT u_id,u_userName,u_password,u_content FROM t_user ">
<field column="u_id" name="user_id"/>
<field column="u_userName" name="user_userName"/>
<field column="u_password" name="user_password"/>
<field column="u_content" name="user_content"/>
</entity>
</document>
</dataConfig>
配置至少两个节点
datasource是源数据节点,原则上讲可以配置多个DataSource去连接多个数据库
document对应solr创建的数据,里面是对应的实体类配置
pk是主键,字段对应属性
5、在solr服务器中添加所有必要的属性
6、重启服务器,选择dataimport——execute导入数据库文件
打开MySQL
创建一个简单的数据库
重启solr服务器-execute
再次refresh就可以看到数据导入了
代码实操
创建项目,添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.szxs</groupId>
<artifactId>SolrDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.3.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
注释
import org.apache.solr.client.solrj.beans.Field;
public class Product {
@Field("product_id")
private int product_id;
@Field
private String product_name;
@Field
private double product_price;
@Field
private String product_desc;
public Product() {
}
public Product(int product_id, String product_name, double product_price, String product_desc) {
this.product_id = product_id;
this.product_name = product_name;
this.product_price = product_price;
this.product_desc = product_desc;
}
public int getProduct_id() {
return product_id;
}
public void setProduct_id(int product_id) {
this.product_id = product_id;
}
public String getProduct_name() {
return product_name;
}
public void setProduct_name(String product_name) {
this.product_name = product_name;
}
public double getProduct_price() {
return product_price;
}
public void setProduct_price(double product_price) {
this.product_price = product_price;
}
public String getProduct_desc() {
return product_desc;
}
public void setProduct_desc(String product_desc) {
this.product_desc = product_desc;
}
}
应用
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.Arrays;
import java.util.List;
public class SolrTest {
//指定solr服务器的地址
private final static String SOLR_URL = "http://localhost:8983/solr/user_core";
/**
* 创建SolrServer对象
*
* 该对象有两个可以使用,都是线程安全的
* 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的
* 2、 EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了
* 3、solr 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
*
* @return
*/
public HttpSolrClient createSolrServer(){
HttpSolrClient solr = null;
solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();
return solr;
}
/**
* 往索引库添加文档
* @throws IOException
* @throws SolrServerException
*/
public void addDoc() throws SolrServerException, IOException{
//构造一篇文档(对象)
SolrInputDocument document = new SolrInputDocument();
//往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
document.addField("product_id", "100");
document.addField("product_name", "小白菜");
document.addField("product_price", "99.8");
document.addField("product_desc", "我就是一颗小白菜,长也长不大");
//获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core
HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL ).build();
solr.add(document);
solr.commit();
solr.close();
}
public void addDoc(Product product) throws SolrServerException, IOException{
//构造一篇文档(对象)
SolrInputDocument document = new SolrInputDocument();
//往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
document.addField("product_id", product.getProduct_id());
document.addField("product_name", product.getProduct_name());
document.addField("product_price", product.getProduct_price());
document.addField("product_desc", product.getProduct_desc());
//获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core
HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL ).build();
solr.add(document);
solr.commit();
solr.close();
}
/**
* 根据id从索引库删除文档
*/
public void deleteDocumentById() throws Exception {
//选择具体的某一个solr core
HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL ).build();
//删除文档
//server.deleteById("036cd386-fbb0-4dde-8c47-f580b938538e");
server.deleteByQuery("product_id:100");
//删除所有的索引
//solr.deleteByQuery("*:*");
//提交修改
server.commit();
server.close();
}
/**
* 查询
* @throws Exception
*/
public void querySolr() throws Exception{
HttpSolrClient solrServer = new HttpSolrClient.Builder(SOLR_URL ).build();
SolrQuery query = new SolrQuery("*:*");
//下面设置solr查询参数
// query.set("q", "*:*");// 参数q 查询所有
query.set("q", "product_desc:白菜");
// query.set("q","白菜");//相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来 ,这个作用适用于联想查询
//参数fq, 给query增加过滤查询条件
// query.addFilterQuery("product_id:[100 TO 500]");//id为0-5
// query.addFilterQuery("product_price:[50 TO *]");//
// query.addFilterQuery("product_price:[* TO 90]");//
//给query增加布尔过滤条件
// query.addFilterQuery("product_desc:白菜"); //
//参数df,给query设置默认搜索域
// query.set("df", "product_name");
//参数sort,设置返回结果的排序规则
// query.setSort("product_id",SolrQuery.ORDER.desc);
//设置分页参数
// query.setStart(1);
// query.setRows(1);//每一页多少值
//参数hl,设置高亮
// query.setHighlight(true);
// //设置高亮的字段
// query.addHighlightField("product_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("product_id")+" name:"+doc.get("product_name")+" description:"+doc.get("product_desc"));
// }
//得到实体对象
List<Product> tmpLists = response.getBeans(Product.class);
if(tmpLists!=null && tmpLists.size()>0){
System.out.println("通过文档集合获取查询的结果");
for(Product per:tmpLists){
System.out.println("id:"+per.getProduct_id()+
" name:"+per.getProduct_name()+
" price:"+per.getProduct_price()+
" description:"+ per.getProduct_desc());
}
}
}
public static void main(String[] args) throws Exception {
SolrTest solr = new SolrTest();
solr.createSolrServer();
// solr.addDoc();
// solr.addDoc(new Product(1001, "大白菜",
// 48.8, "我是一颗大白菜,再长也长不大"));
solr.deleteDocumentById();
// solr.querySolr();
}
}