Solr 全文检索服务器(二)

solr


2.6 建立java程序访问solr服务器

  • 建立数据库
图示
图示
  • 配置步骤说明:
  1. 建立项目
  2. 建立索引
  3. 搜索索引

2.6.1 建立项目,导入jar包

  • SolrJ核心包 /solr-4.10.3/dist/solr-solrj-4.10.3.jarjava

  • SolrJ依赖包 /solr-4.10.3/dist/solrj-lib下的全部包mysql

  • 日志依赖包 /solr-4.10.3/example/lib/ext目录下的全部jar包sql

  • JDBC驱动包 mysql-connector-java-5.1.10-bin.jar数据库

  • 拷贝log4j.properties到src目录下apache

项目结构

2.6.2 建立索引

2.6.2.1 采集数据

  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,事先定义域的信息的
  1. 修改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 {
			// 一、创建和服务器的链接 当不指定链接哪个solrCore时,默认链接第一个
			HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/jd");

			// 二、将文档写入索引库,完成分词、建立索引的过程
			ProductDao dao = new ProductDao();
			server.add(dao.getDocuments(dao.getAll()));

			// 三、提交事物 在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();
		}
	}

3、Solr控制台

图示
  1. q - 查询关键字,必须,若是查询全部文档时,使用*:*。
  2. fq - (filter query)过虑查询,能够有多个。如:价格10到50的记录。
  3. sort - 排序,格式:sort=<field name>+<desc|asc>。如:按价格升序
  4. start - 分页显示使用,开始记录下标,从0开始
  5. rows - 指定返回结果最多有多少条记录,配合start来实现分页。
  6. fl - 指定返回那些字段内容,用逗号或空格分隔多个。
  7. df-指定一个默认搜索的Field
  8. wt - (writer type)指定输出格式,默认json格式。

  关于Solr分享就到这里,有关安装Dataimport插件和中文分词器如有须要能够评论留言。json

版权说明:欢迎以任何方式进行转载,但请在转载后注明出处!服务器

相关文章
相关标签/搜索