一,Solr简介
1,Solr是什么
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G SolrJ操作提出查找请求(也可以提交json格式),并得到XML格式的返回结果.
2,Solr与lucene的关系
Luncene是一套信息检索工具包,但并不包含搜索引擎系统,它包含了索引结构,读写索引工具、相关性工具(其他的搜索组件)、排序等功能,因此在使用luncene时你扔需要关注搜索引擎系统,例如数据获取、解析、分词等方面的东西。
首先solr是基于luncene做的,solr的目标是打造一款企业级的搜索引擎系统,因此它更接近于我们认识到的搜索引擎系统,它是一个搜索引擎服务,通过各种API可以让你的应用使用搜索服务,而不需要将搜索逻辑耦合在应用中。而且solr可以根据配置文件定义数据解析的方式,更像是一个搜索框架,它也支持主从(集群中的方式)、热换库(索引的数据与数据库的同步)等操作,还添加了高亮、facet(搜索组件)等搜索引擎常见功能的支持。
二,Solr环境配置
(1),Solr下载
solr安装包的下载
(2),整合Solr和tomcat
Solrhome目录是Solr运行的主目录,目录中包括了运行Solr实例所有配置文件和数据文件,Solr实例是SolrCore,一个SolrHome可以包括多个SolrCore,每个SolrHome提供单独的搜索和索引服务。
②将Solr里面的solr.war文件解压拷贝到tomcat里面的webapps目录下
1.solr.war的路径
2.solr解压路径
③将solr-4.10中依赖包导入tomcat的solr中
1.solr-4.10包的位置
2.导入tomcat的solr位置
④将solr-4.10中SolrCore(solr实例)导入Solrhome中
solr-4.10中SolrCore(solr实例)路径
Solrhome路径
⑤在solrCode的web.xml中配置Solrhome中
solrCode的web.xml路径
solrCode的web.xml配置代码(web-app标签中)
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>C:\myself\solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
⑥启动tomcat
三,collection介绍
(1)collection集合介绍
(2)collection添加
1.将collection1复制一份改名为collection2
2.更改配置文件
注意:collection是对搜索分模块用到一般用不到
(3)添加IKAnalyzer分析器
1.IKAnalyzer包导入
2.在tomcat的WEN-INF文件夹里面新建一个classes文件夹添加以下文件文件内容可以在lucene中找到
3.在solrHome\collection1\config\schema.xml添加如下代码
<!--IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<!--IKAnalyzer Field-->
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
(4)导入数据
1.在solrhome\collection1目录新建lib目录导入两个数据导入包和一个数据库驱动包
两个数据导入包位置
配置数据库域
在solrhome\collection1\conf\solrconfig.xml文件里面找到
<!-- Legacy config for the admin interface -->
<admin>
<defaultQuery>*:*</defaultQuery>
</admin>
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
在solrhome\collection1\conf目录下建一个data-config.xml文件配置数据库
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/shop"
user="root"
password="123"/>
<document>
<entity name="product" query="SELECT pid,pname,shop_price,pdesc,pimage From product">
<field column="pid" name="id"/>
<field column="pname" name="product_name"/>
<field column="shop_price" name="product_price"/>
<field column="pdesc" name="product_description"/>
<field column="pimage" name="product_picture"/>
</entity>
</document>
</dataConfig>
3.配置数据库域在solrHome\collection1\config\schema.xml添加如下代码
<!--product-->
<field name="product_name" type="text_ik" indexed="true" stored="true" />
<field name="product_price" type="float" indexed="true" stored="false" />
<field name="product_description" type="text_ik" indexed="true" stored="true" />
<field name="product_picture" type="string" indexed="false" stored="true" />
<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>
4.从solr管理系统导入数据
5Solr管理系统查询
三,代码实现
1.导包
依赖包
核心包
2.代码
①添加
//管理系统路径
String base="http://localhost:8080/solr/";
//单机版solr
SolrServer solrServer=new HttpSolrServer(base);
SolrInputDocument docs=new SolrInputDocument();
docs.setField("id", "hh");
docs.setField("name", "ttt");
//添加文档
solrServer.add(docs);
solrServer.commit();
System.out.println("完成!")
②删除
String base="http://localhost:8080/solr/";
//单机版solr
SolrServer solrServer=new HttpSolrServer(base);
//条件删除
solrServer.deleteByQuery("*:*",1000);
solrServer.commit();
System.out.println("完成!");
④查询
String base="http://localhost:8090/solr/";
//单机版solr
SolrServer solrServer=new HttpSolrServer(base);
//过滤对象
SolrQuery solrQuery=new SolrQuery();
//关键词
solrQuery.set("q", "*:*");
//solrQuery.setQuery("product_name:索尼");
//执行查询
QueryResponse response=solrServer.query(solrQuery);
//文档结果集
SolrDocumentList docs=response.getResults();
long numFound=docs.getNumFound();
System.out.println(numFound);
for(SolrDocument doc:docs)
{
System.out.println(doc.get("product_picture"));
System.out.println(doc.get("id"));
System.out.println(doc.get("product_price"));
System.out.println(doc.get("product_name"));
}
System.out.println("完成!");
⑤条件查询
String base="http://localhost:8090/solr/";
//单机版solr
SolrServer solrServer=new HttpSolrServer(base);
//过滤对象
SolrQuery solrQuery=new SolrQuery();
//关键词
//solrQuery.set("q", "*:*");
//solrQuery.setQuery("product_name:索尼");
solrQuery.setQuery("小米");
//设置过滤条件
solrQuery.set("fq", "id:[* TO 2]");
//id排序
solrQuery.addSort("id",ORDER.desc);
//分页
solrQuery.setStart(0);
solrQuery.setRows(3);
//默认域
solrQuery.set("df", "product_name");
//指定查询域
solrQuery.set("fl", "id,product_picture,product_name");
//高亮
//打开高亮开关
solrQuery.setHighlight(true);
//指定高亮域
//高亮前后缀
solrQuery.setHighlightSimplePre("<span style='color:red'>");
solrQuery.setHighlightSimplePost("/<span>");
//执行查询
QueryResponse response=solrServer.query(solrQuery);
//获得高亮
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
//Map k id V MAp
//Map K 域名 V LIst
//List list.get(0)
//文档结果集
SolrDocumentList docs=response.getResults();
//总条数
long numFound=docs.getNumFound();
System.out.println(numFound);
for(SolrDocument doc:docs)
{
System.out.println(doc.get("product_picture"));
System.out.println(doc.get("id"));
System.out.println(doc.get("product_name"));
Map<String, List<String>> map = highlighting.get(doc.get("id"));
List<String> list = map.get("product_name");
System.out.println(list.get(0)+":::::");
}
System.out.println("完成!");
⑥条件查询京东案例
1).配置SolrJ bean
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg value="http://localhost:8090/solr/collection1"/>
</bean>
2).代码
@Autowired
SolrServer solrServer;
@Override
public List<Product> selectProductModelListByQuery(String queryString, String catalog_name, String price,
String sort) throws Exception {
//条件对象
SolrQuery solrQuery=new SolrQuery();
//过滤条件
//搜索关键词
if(queryString!=null&&!"".equals(queryString))
{
solrQuery.setQuery(queryString);
}
else
{
solrQuery.setQuery("*");
}
//过滤条件
if(catalog_name!=null&&!"".equals(catalog_name))
{
solrQuery.set("fq", "product_catalog_name:"+catalog_name);
}
System.out.println(price);
//价格范围
if(price!=null&&!"".equals(price))
{
String[] p=price.split("-");
solrQuery.set("fq","product_price:["+p[0]+" TO "+p[1]+"]");
}
//价格排序方式
if("1".equals(sort))
{
solrQuery.addSort("product_price",ORDER.desc);
}
else
{
solrQuery.addSort("product_price",ORDER.asc);
}
//分页
solrQuery.setStart(0);
solrQuery.setRows(12);
//默认域
solrQuery.set("df","product_name");
//只查指定域
solrQuery.set("fl", "id,product_name,product_price,product_picture");
//高亮
//开关
solrQuery.setHighlight(true);
//前缀后缀
solrQuery.setHighlightSimplePre("<span style='color:red'>");
solrQuery.setHighlightSimplePost("</span>");
//执行查询
QueryResponse response=solrServer.query(solrQuery);
//结果收集文档
SolrDocumentList docs=response.getResults();
//总条数
Map<String,Map<String,List<String>>> highlighting=response.getHighlighting();
long number=docs.getNumFound();
List<Product> productModels=new ArrayList<Product>();
//遍历
for(SolrDocument doc:docs)
{
Product product=new Product();
System.out.println("id:"+doc.get("id"));
product.setPid((String)doc.get("id"));
Map<String, List<String>> map = highlighting.get(doc.get("id"));
List<String> list = map.get("product_name");
System.out.println(list.get(0)+":::::");
product.setPicture((String)doc.get("product_picture"));
product.setPrice((Double)doc.get("product_price"));
System.out.println(doc.get("product_name"));
product.setName(list.get(0));
productModels.add(product);
//Map K id V Map
//Map K 域名 V List
//List list.get(0)
}
return productModels;
}