什么是solr:
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:
- 创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr服务器根据xml文档添加、删除、更新索引 。
- 搜索索引:客户端(可以是浏览器可以是Java程序)用 GET方法向 Solr 服务器发送请求,然后对 Solr服务器返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建页面UI的功能,但是Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
Solr的使用:
schema.xml它是Solr数据表配置文件,在此配置文件中定义了域以及域的类型还有其他一些配置,在solr中域必须先定义后使用。
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
|
- Name:域的名称
- Type:域的类型
- Indexed:是否索引
- Stored:是否存储
- Required:是否必须
- multiValued:是否是多值,存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图)
复制域:
<copyField source="cat" dest="text" /> dest是目标域:目标域必须可以多只存储
动态域:
<dynamicField name="*_i" type="int" indexed="true" stored="true"/> |
搜索时只有有一个***_i就可以匹配这个域不需要重新定义这个域 例如product_i 和 goods_i 都可以匹配这个域
添加索引:
@Test
public void addDocument() throws Exception {
// 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
// 2、 创建SolrInputDocument对象,然后通过它来添加域。
SolrInputDocument document = new SolrInputDocument();
// 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
document.addField("id", "c0001");
document.addField("title_ik", "使用solrJ添加的文档");
document.addField("content_ik", "文档的内容");
document.addField("product_name", "商品名称");
// 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
server.add(document);
// 4、 提交。
server.commit();
}
如果这个域中id是唯一键,若添加的id已经存在则执行更新操作,若添加的id不存在则执行插入的操作
查询操作
q - 查询关键字 如果查询所有则是 *:*
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的
query.set("fq","price:[10 TO 50]"); * 代表无限
价格大于50 query.set("fq","price:[50 TO *]");
价格小于50 query.set("fq","price:[* TO 50]");
sort 排序
query.setSortField("weekSales_i", SolrQuery.ORDER.desc);
start - 分页显示使用,开始记录下标,从0开始
rows - 指定返回结果最多有多少条记录,配合start来实现分页
fl - 指定返回那些字段内容,用逗号或空格分隔多个
df-指定一个搜索Field 即默认域
@Test public void queryIndex2() throws Exception { // 创建HttpSolrServer对象,通过它和Solr服务器建立连接。 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/"); // 创建SolrQuery对象 SolrQuery query = new SolrQuery(); // 设置查询条件 query.setQuery("钻石"); // 设置过滤条件 query.setFilterQueries("product_catalog_name:幽默杂货"); // 设置排序 query.setSort("product_price", ORDER.desc); // 设置分页信息 query.setStart(0); query.setRows(10); // 设置显得的域的列表 query.setFields("id", "product_name", "product_price", "product_catalog_name", "product_picture");
// 设置默认搜索域 query.set("df", "product_name");
// 设置高亮 query.setHighlight(true); query.addHighlightField("product_name"); query.setHighlightSimplePre("<em>"); query.setHighlightSimplePost("</em>");
// 调用server的查询方法,查询索引库 QueryResponse response = server.query(query);
// 查询结果 SolrDocumentList results = response.getResults();
// 查询结果总数 long cnt = results.getNumFound(); System.out.println("查询结果总数:" + cnt);
for (SolrDocument solrDocument : results) { System.out.println(solrDocument.get("id"));
String productName = (String) solrDocument.get("product_name");
//获取高亮列表 Map<String, Map<String, List<String>>> highlighting = response .getHighlighting(); //获得本文档的高亮信息 List<String> list = highlighting.get(solrDocument.get("id")).get( "product_name"); //如果有高亮,则把商品名称赋值为有高亮的那个名称 if (list != null) { productName = list.get(0); }
System.out.println(productName); System.out.println(solrDocument.get("product_price")); System.out.println(solrDocument.get("product_catalog_name")); System.out.println(solrDocument.get("product_picture"));
} } |