1、solr基本操作
1.1、基本概念
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化
- solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能
- 业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可
什么情况下会使用solr
要查询的内容经常涉及多张表,优先把数据查了放入solr里面,之后就不需要经常去数据库里反复联表查询
1. 2、基本操作solr
- 下载地址:http://lucene.apache.org/solr/
- 解压压缩包。
- 进入解压目录下的bin目录,在此目录下打开命令行,输入命令solr.cmd start
- 启动solr服务器,服务默认端口8983
出现happy 即可
和redis不一样,这个启动之后可以关掉 - 访问localhost:8983,进入solr界面
- 创建solr core。
注1:solr会在解压目录下的server/solr目录中自动创建与命名相同的文件夹
注2: 但创建会报错, 因为缺少必要的配置文件. 需要在解压目录下的server/solr/configsets/_default目录中复制conf文件夹, 并粘贴到刚刚创建的文件夹中. 然后重新点击add core. - 选择创建好的core, 点击schemaadd field添加属性到core
添加add core会报错
6、选中创建好的core,点击schema——add field添加属性到core
solr数据库没有表的概念,不依赖于类,而独立存在,可以创建属性,所以数据添加的时候可以根据需要创建
因为没有表和类,不需要同名属性,所以命名为表名_属性名,这样就可以知道如何对标哪个表
7、选择documents,在document type中选择document builder,然后选择需要添加的属性,并且赋值,所有属性设置完毕后,点击submit添加
属性的添加时独立的,不需要考虑是哪个表
8、选择query,并设置相关查询要求进行查询
必然是有的,ID永远不会重复
1 3、(中文)分词查询
1、进入需要设置中文分词的core的conf文件夹,变价solrconfig.xml文件,添加如下内容
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" regex="lucene-analyzers-smartcn-\d.*\.jar" />
2、编辑同文件夹中的managed-schema文件,添加内容如下
添加一个属性和分词定义![在这里插入图片描述]
3、重启solr服务器solr.cmd stop -p 8983
启动solr.cmd start
4、在schema里添加一个file
选中刚刚添加进去的类型
可以去analysis进行测试
按照字符串进行匹配
按照自定义的类型匹配
1.4数据导入
1、编辑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" />
2、将需要使用的数据库jdbc jar包添加到解压目录的server\solr-webapp\webapp\WEB-INF\lib
版本不重要
3、编辑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>
4、在同目录下,添加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就可以看到数据导入了
2.1创建项目,添加依赖
<?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>
2.2、注释
在属性上添加@Field(“product_id”)
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;
}
}
2.3、应用
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();
}
}