solrJ的使用
Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。
1、solr的安装及配置
需要把solr服务器安装到linux环境:
第一步:安装linux、jdk、tomcat。
jdk的安装:上传jdk的压缩包到linux上
解压jdk
配置环境变量的配置文件 vim /etc/prifile
添加三个属性 JAVA_HOME=/jdk目录
PATH=/jdk目录/bin:$PATH
export JAVA_HOME PATH
注销后即可生效
tomcat的安装: 上传tomcat压缩包到linux上
解压tomcat即可
第二步:把solr的压缩包上传到服务器。并解压。
第三步:把/../solr-4.10.3/dist/solr-4.10.3.war包部署到tomcat下( cp solr-4.10.3.war /.../tomcat/webapps/solr.war)。并改名为solr.war (这个就是solr工程的war包)
第四步:解压war包(启动tomcat自动解压)。关闭tomcat。删除solr.war.
第五步:把/../solr-4.10.3/example/lib/ext 目录下所有的jar包复制到solr工程中(cp * /.../tomcat/webapps/solr/WEB-INF/lib/)。
第六步:创建solrhome。Solrhome是存放solr服务器所有配置文件的目录(把/.../solr-xxx/example下的solr目录 考到 solrhome目录下 )。
第七步:告诉solr服务器solrhome的位置。需要修改solr工程的web.xml文件。
第八步:启动tomcat 在浏览器中访问 linuxIP:8080/solr
2、配置 中文解析器、业务字段
在 solrhome/collection1/conf/schema.xml 中配置中文解析器
①、在solr中默认是中文分析器,需要手工配置。配置一个FieldType,在FieldType中指定中文分析器;Solr中的字段必须是先定义后使用。
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
②、业务字段判断标准:1、在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述 2、后续的业务是否需要用到此字段。例如:商品id。
在 solrhome/collection1/conf/schema.xml 中配置业务字段
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
重启tomcat;
3、solrJ客户端
需要依赖solrj的jar包。
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>
solrJ的使用
public class SolrJTest {
//添加索引
@Test
public void addDocument() throws Exception {
//创建一个连接
SolrServer solrServer = new HttpSolrServer("http://linuxIP:8080/solr");
//创建一个solr的文档对象
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "test001"); //第一个是key(需要和solr配置的字段一样),第二个是value
document.addField("item_title", "测试商品2");
document.addField("item_price", 54321);
//把文档对象写入索引库
solrServer.add(document);
//提交
solrServer.commit();
}
//删除索引
@Test
public void deleteDocument() throws Exception {
//创建一连接
SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
//solrServer.deleteById("test001");
solrServer.deleteByQuery("*:*"); //删除所有
solrServer.commit();
}
//查询索引
@Test
public void queryDocument() throws Exception {
SolrServer solrServer = new HttpSolrServer(
"http://192.168.253.181:8080/solr");
// 创建一个查询对象
SolrQuery query = new SolrQuery();
// 设置查询条件
query.setQuery("*:*");
query.setStart(20);
query.setRows(50);
// 执行查询
QueryResponse response = solrServer.query(query);
// 取查询结果
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("共查询到记录:" + solrDocumentList.getNumFound());
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("item_title"));
System.out.println(solrDocument.get("item_price"));
System.out.println(solrDocument.get("item_image"));
}
}
}
发布一个solr的搜索服务: 创建一搜素的服务工程
1、使用java程序读取mysql数据库中的商品信息,然后创建solr文档对象,把商品信息写入索引库(在solr服务上写导入的java代码)。
@Override
public TaotaoResult importAllItems() {
try {
//查询商品列表
List<Item> list = itemMapper.getItemList();
//把商品信息写入索引库
for (Item item : list) {
//创建一个SolrInputDocument对象
SolrInputDocument document = new SolrInputDocument();
document.setField("id", item.getId());
document.setField("item_title", item.getTitle());
document.setField("item_sell_point", item.getSell_point());
document.setField("item_price", item.getPrice());
document.setField("item_image", item.getImage());
document.setField("item_category_name", item.getCategory_name());
document.setField("item_desc", item.getItem_des());
//写入索引库
solrServer.add(document);
}
//提交修改
solrServer.commit();
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
return TaotaoResult.ok();
}
4、搜索服务的发布
http形式的服务。对外提供搜索服务是一个get形式的服务。调用此服务时需要查询条件
,分页条件可以使用page(要显示第几页)、rows(每页显示的记录数)。返回一个json格式的数据。可以使用TaotaoResult包装一个商品列表转换成json。
dao层
@Override
public SearchResult search(SolrQuery query) throws Exception {
// 返回值对象
SearchResult result = new SearchResult(); //记录商品列表、总记录、总页、当前页
// 根据查询条件query查询索引库
QueryResponse queryResponse = solrServer.query(query);
// 取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
// 取查询结果总数量
result.setRecordCount(solrDocumentList.getNumFound());
// 商品列表
List<Item> itemList = new ArrayList<>();
// 取高亮显示
Map<String, Map<String, List<String>>> highlighting = queryResponse
.getHighlighting();
// 取商品列表
for (SolrDocument solrDocument : solrDocumentList) {
// 创建一商品对象
Item item = new Item();
item.setId((String) solrDocument.get("id"));
// 取高亮显示的结果
List<String> list = highlighting.get(solrDocument.get("id")).get(
"item_title");
String title = "";
if (list != null && list.size() > 0) {
title = list.get(0);
} else {
title = (String) solrDocument.get("item_title");
}
item.setTitle(title);
item.setImage((String) solrDocument.get("item_image"));
item.setPrice((long) solrDocument.get("item_price"));
item.setSell_point((String) solrDocument.get("item_sell_point"));
item.setCategory_name((String) solrDocument
.get("item_category_name"));
// 添加的商品列表
itemList.add(item);
}
result.setItemList(itemList);
return result;
}
service层
@Override
public SearchResult search(String queryString, int page, int rows)
throws Exception {
// 创建查询对象 solrJ定制版对象
SolrQuery query = new SolrQuery();
// 设置查询条件
query.setQuery(queryString);
// 设置分页
query.setStart((page - 1) * rows);
query.setRows(rows);
// 设置默认搜素域
query.set("df", "item_keywords");
// 设置高亮显示
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
// 执行查询
SearchResult searchResult = searchDao.search(query);
// 计算查询结果总页数
long recordCount = searchResult.getRecordCount();
long pageCount = recordCount / rows;
if (recordCount % rows > 0) {
pageCount++;
}
searchResult.setPageCount(pageCount);
searchResult.setCurPage(page);
return searchResult;
}
controller层
接收查询参数:查询条件、page、rows调用Service执行查询返回一个查询结果对象。 把查询结果包装到Result中返回,结果是json格式的数据。