2.6 创建java程序访问solr服务器
- 创建数据库
图示 |
---|
![]() |
图示 |
---|
![]() |
- 配置步骤说明:
- 创建项目
- 创建索引
- 搜索索引
2.6.1 创建项目,导入jar包
-
SolrJ核心包 /solr-4.10.3/dist/solr-solrj-4.10.3.jar
-
SolrJ依赖包 /solr-4.10.3/dist/solrj-lib下的所有包
-
日志依赖包 /solr-4.10.3/example/lib/ext目录下的所有jar包
-
JDBC驱动包 mysql-connector-java-5.1.10-bin.jar
-
拷贝log4j.properties到src目录下
项目结构 |
---|
![]() |
2.6.2 创建索引
2.6.2.1 采集数据
- 创建Product类
package com.xkt.solr.pojo;
/**
* @author lzx
*
*/
public class Product {
private Integer pid;
private String name;
private String catalogName;
private double price;
private String description;
private String picture;
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCatalogName() {
return catalogName;
}
public void setCatalogName(String catalog_name) {
this.catalogName = catalog_name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
@Override
public String toString() {
return "Product [pid=" + pid + ", name=" + name + ", catalogName=" + catalogName + "]";
}
}
2.6.2.2 创建ProductDao类
package com.xkt.solr.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.common.SolrInputDocument;
import com.xkt.solr.pojo.Product;
/**
* @author lzx
*
*/
public class ProductDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
/**
* 获得所有数据
*
* @return
*/
public List<Product> getAll() {
List<Product> products = new ArrayList<>();
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/solr", "root", "1234");
// 3.获取prepareStatement预编译
ps = conn.prepareStatement(
"SELECT pid, name, catalog, catalog_name, price, number, description, picture, release_time FROM products");
// 4.执行搜索
rs = ps.executeQuery();
Product product = null;
// Product product = new Product();
while (rs.next()) {
product = new Product();
product.setPid(rs.getInt("pid"));
product.setName(rs.getString("name"));
product.setPrice(rs.getFloat("price"));
product.setPicture(rs.getString("picture"));
product.setDescription(rs.getString("description"));
product.setCatalogName(rs.getString("catalog_name"));
System.out.println(product);
products.add(product);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != ps) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != rs) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return products;
}
}
2.6.2.3 创建测试类ProductDaoTest
package com.xkt.solr.test;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
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.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.junit.Test;
import com.xkt.solr.dao.ProductDao;
import com.xkt.solr.pojo.Product;
/**
* @author lzx
*
*/
public class ProductDaoTest {
/**
* 测试采集所有数据
*/
@Test
public void getAll() {
ProductDao productDao = new ProductDao();
List<Product> products = productDao.getAll();
System.out.println(products);
}
}
测试结果 |
---|
![]() |
2.6.2.4 将数据转换成Solr文档
- Solr是通过一个配置文件schema.xml,事先定义域的信息的
- 修改schema.xml,添加如下配置。(id域不用配置,直接使用solr的id域)
<!--product-->
<field name="id" type="string" indexed="true" stored="true" required="true"
multiValued="false" />
<field name="product_name" type="text_general" indexed="true" stored="true"/>
<field name="product_catalog_name" type="string" indexed="true" stored="true" />
<field name="product_price" type="double" indexed="true" stored="true"/>
<field name="product_description" type="text_general" indexed="true" stored="false" />
<field name="product_picture" type="string" indexed="false" stored="true" />
2.6.2.5 修改ProductDao,新增getDocuments方法
package com.xkt.solr.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.common.SolrInputDocument;
import com.xkt.solr.pojo.Product;
/**
* @author lzx
*
*/
public class ProductDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
/**
* 获得所有数据
*
* @return
*/
public List<Product> getAll() {
List<Product> products = new ArrayList<>();
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/solr", "root", "1234");
// 3.获取prepareStatement预编译
ps = conn.prepareStatement(
"SELECT pid, name, catalog, catalog_name, price, number, description, picture, release_time FROM products");
// 4.执行搜索
rs = ps.executeQuery();
Product product = null;
// Product product = new Product();
while (rs.next()) {
product = new Product();
product.setPid(rs.getInt("pid"));
product.setName(rs.getString("name"));
product.setPrice(rs.getFloat("price"));
product.setPicture(rs.getString("picture"));
product.setDescription(rs.getString("description"));
product.setCatalogName(rs.getString("catalog_name"));
System.out.println(product);
products.add(product);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != ps) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != rs) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return products;
}
/**
* 获得文档
*
* @param products
* @return
*/
public List<SolrInputDocument> getDocuments(List<Product> products) {
List<SolrInputDocument> docs = new ArrayList<>();
SolrInputDocument doc = null;
for (Product product : products) {
doc = new SolrInputDocument();
doc.addField("id", product.getPid());
doc.addField("product_name", product.getName());
doc.addField("product_catalog_name", product.getCatalogName());
doc.addField("product_price", product.getPrice());
doc.addField("product_description", product.getDescription());
doc.addField("product_picture", product.getPicture());
docs.add(doc);
}
return docs;
}
}
2.6.2.6 连接Solr服务器,创建索引
- 前提:已经启动了Tomcat,加载了Solr服务器。(前面给过schema.xml,需要重新启动Tomcat)
- 修改ProductDaoTest类,新增createIndex方法
/**
* 采集数据后创建索引
*/
@Test
public void creatIndex() {
try {
// 1、建立和服务器的连接 当不指定连接哪一个solrCore时,默认连接第一个
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/jd");
// 2、将文档写入索引库,完成分词、创建索引的过程
ProductDao dao = new ProductDao();
server.add(dao.getDocuments(dao.getAll()));
// 3、提交事物 在solr中,事物提交可以省略
server.commit();
System.out.println("创建索引成功");
} catch (Exception e) {
e.printStackTrace();
}
}
2.6.2.7 访问Solr主界面,在Query选项下测试
图示 |
---|
![]() |
- 创建索引库成功!!!
2.6.3 搜索索引
- 修改ProductDaoTest类型,新增一个查询方法
/**
* 搜索索引
*/
@Test
public void searchIndex() {
// 1建立与服务器的连接
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/jd");
// 2.创建查询对象SolrQuery,用来封装查询条件
SolrQuery query = new SolrQuery();
// 3.设置查询条件
query.set("q", "*:*");
try {
// 4.执行搜索
QueryResponse response = server.query(query);
// 5.渲染查询结果
int status = response.getStatus();
if (0 == status) {
SolrDocumentList docs = response.getResults();
long numFound = docs.getNumFound();
System.out.println("共查到" + numFound + "条数据");
System.out.println("---------华丽的分割线---------");
for (SolrDocument doc : docs) {
String pid = (String) doc.get("id");
String name = (String) doc.get("product_name");
String catName = (String) doc.get("product_catalog_name");
double price = (double) doc.get("product_price");
String picture = (String) doc.get("product_picture");
String desc = (String) doc.get("product_description");
System.out.println("商品的id: " + pid);
System.out.println("商品的名称: " + name);
System.out.println("商品的类别: " + catName);
System.out.println("商品的价格: " + price);
System.out.println("商品的图片: " + picture);
System.out.println("商品的描述: " + desc);
}
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
三、Solr控制台
图示 |
---|
![]() |
- q - 查询关键字,必须,如果查询所有文档时,使用*:*。
- fq - (filter query)过虑查询,可以有多个。如:价格10到50的记录。
- sort - 排序,格式:sort=<field name>+<desc|asc>。如:按价格升序
- start - 分页显示使用,开始记录下标,从0开始
- rows - 指定返回结果最多有多少条记录,配合start来实现分页。
- fl - 指定返回那些字段内容,用逗号或空格分隔多个。
- df-指定一个默认搜索的Field
- wt - (writer type)指定输出格式,默认json格式。
关于Solr分享就到这里,有关安装Dataimport插件和中文分词器若有需要可以评论留言。
版权说明:欢迎以任何方式进行转载,但请在转载后注明出处!