您的位置:首页 > 其它

全文检索技术---solr

2017-07-02 22:29 260 查看

1 Solr介绍

1.1 什么是solr

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。

Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化

使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:

l 创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr服务器根据xml文档添加、删除、更新索引 。

l 搜索索引:客户端(可以是浏览器可以是Java程序)用 GET方法向 Solr 服务器发送请求,然后对 Solr服务器返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建页面UI的功能,但是Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况

1.2 Solr和Lucene的区别

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索应用。Lucene仅提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索应用。

Solr的目标是打造一款企业级的搜索引擎系统,它是基于Lucene一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。

                

package cn.xjy.test ;

import java.io.IOException ;
import java.util.List ;
import java.util.Map ;
import org.apache.solr.client.solrj.SolrQuery ;
import org.apache.solr.client.solrj.SolrQuery.ORDER ;
import org.apache.solr.client.solrj.SolrServer ;
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.apache.solr.common.SolrInputDocument ;
import org.junit.Before ;
import org.junit.Test ;

public class TestSolrJ {

SolrServer    solrServer    = null ;

@Before
public void init() {
// 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
solrServer = new HttpSolrServer("http://localhost:8080/solr/collection2") ;
}

/**
* 更新或添加
* 存在就更新,不存在就添加(根据id判断)
* @throws Exception
* @throws IOException
*/
@Test
public void testAddandUpdate() throws Exception, IOException {

// 2、 创建SolrInputDocument对象,然后通过它来添加域。
SolrInputDocument doc = new SolrInputDocument() ;

/* 测试添加 */
/* doc.addField("id","测试1"); doc.addField("product_name","测试name");
* doc.addField("product_catalog_name","测试product_catalog_name");
* doc.addField("product_price",22f);
* doc.addField("product_description","测试product_description");
* doc.addField("product_picture","测试product_picture"); */

/* 测试更新 */

// 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
// 第二个参数:域的值
// 注意:id的域不能少
doc.addField("id", "测试1") ;
doc.addField("product_name", "测试更新name") ;
doc.addField("product_catalog_name", "测试更新product_catalog_name") ;
doc.addField("product_price", 23f) ;
doc.addField("product_description", "测试更新product_description") ;
doc.addField("product_picture", "测试更新product_picture") ;

// 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
solrServer.add(doc) ;

// 4、 提交。
solrServer.commit() ;
}

/**
* 删除索引
* @throws Exception
*/
@Test
public void testDelete() throws Exception {
// 根据id删除
/* solrServer.deleteById("测试1") ; solrServer.commit(); */

// 根据条件删除
solrServer.deleteByQuery("product_price:23") ;

// 全部删除
// solrServer.deleteByQuery("*:*");
solrServer.commit() ;
}

/**
* 简单查询
* @throws Exception
*/
@Test
public void testSimpleQuery() throws Exception {

SolrQuery query = new SolrQuery() ;
// q是固定的且必须 的
query.set("q", "id:测试1") ;
query.set("fl", "id,product_catalog_name") ;
// query.setFields("id", "product_catalog_name");//效果同上

QueryResponse queryResponse = solrServer.query(query) ;

SolrDocumentList results = queryResponse.getResults() ;

System.out.println("总数:" + results.getNumFound()) ;

for (SolrDocument solrDocument : results) {
// System.out.println(solrDocument.get("id")) ;
System.out.println(solrDocument) ;
}
}

/**
* 复杂查询
* @throws Exception
*/
@Test
public void testComplexQuery() throws Exception {
SolrServer solrServer2 = new HttpSolrServer("http://localhost:8080/solr") ;

SolrQuery query = new SolrQuery() ;

// 查询条件
query.setQuery("product_catalog_name:幽默杂货") ;

// 过滤条件
query.setFilterQueries("product_catalog_name:幽默杂货") ;

// 按指定字段排序
query.setSort("id", ORDER.desc) ;

// 分页
query.setStart(0) ;
query.setRows(100) ;

// 设置要显示的字段
// query.setFields("id,product_catalog_name") ;

// 设置默认搜索域
// query.set("df", "product_name");

// 给特定字段设置样式,要显示样式的字段必须是查询条件中的字段
query.setHighlight(true) ;
query.addHighlightField("product_catalog_name") ;
query.setHighlightSimplePre("<span color='red'>") ;
query.setHighlightSimplePost("</sapn>") ;

// 查询
QueryResponse queryResponse = solrServer2.query(query) ;

// 获得结果集
SolrDocumentList results = queryResponse.getResults() ;

System.out.println("总数:" + results.getNumFound()) ;

// 遍历结果集
for (SolrDocument solrDocument : results) {
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting() ;
System.out.println(highlighting.get(solrDocument.get("id"))) ;
System.out.println(solrDocument) ;
}
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: