1. Solr的目录介绍
dist: solr部署的war包,solrJ客户端example\solr: 一个标准的solr的索引库
example\lib\ext: solr服务和solrJ客户端依赖的jar包
2. Solr的环境搭建
a: 准备一台干净的tomcat,并更改其端口,避免与我们的项目冲突b: 解压solr的war包,将解压后的solr放入tomcat的webapps下,并改名为solr(不是必须的)
c: 将example\lib\ext的日志jar拷贝到solr项目的lib包里面
d: 将example\solr拷贝出来,改名为solrHome(不是必须的,大家都习惯叫这个名字)
e: 在solr项目中的web.xml,配置索引库的位置
f: 重启tomcat,访问http://localhost:8888/solr
3. 配置中文分析器
第一步:把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下。
第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的solr/WEB-INF/classes目录下
复制IK分词器配置文件、自定义词典、停用词词典
粘贴到Tomcat的solr的/WEB-INF/classes目录下
第三步:在schema.xml中添加一个自定义的fieldType,使用中文分析器。
<!-- IKAnalyzer-->
<fieldType name="text_ik"class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
第四步:在schema.xml中添加field,指定field的type属性为text_ik
<!--IKAnalyzerField-->
<fieldname="content_ik" type="text_ik" indexed="true"stored="true" />
第五步:重启tomcat
4. Schema.xml中配置业务域
<!--例如:product-->
<fieldname="product_name" type="text_ik" indexed="true" stored="true"/>
<fieldname="product_price" type="float" indexed="true" stored="true"/>
<fieldname="product_description" type="text_ik"indexed="true" stored="false" />
<fieldname="product_picture" type="string"indexed="false" stored="true" />
<fieldname="product_catalog_name" type="string"indexed="true" stored="true" />
<field name="product_keywords"type="text_ik" indexed="true" stored="false"multiValued="true"/>
<!-- 拷贝域 将product_name、product_description的分词拷贝到product_keywords中 搜索product_keywords会搜索product_name、product_description-->
<copyFieldsource="product_name" dest="product_keywords"/>
<copyFieldsource="product_description" dest="product_keywords"/>
5. dataimportHandler插件
使用dataimport插件批量导入数据。
第一步:把dataimport插件依赖的jar包添加到solrcore(collection1\lib)中, 还 需要 mysql 的数据库驱动。orcal数据驱动(ojdbc6)第二步:配置solrconfig.mxl文件,添加一个requestHandler。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler> |
第三步:创建一个data-config.xml,保存到collection1\conf\目录下
<?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/lucene" user="root" password="root"/> <document> <entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products "> <field column="pid" name="id"/> <field column="name" name="product_name"/> <field column="catalog_name" name="product_catalog_name"/> <field column="price" name="product_price"/> <field column="description" name="product_description"/> <field column="picture" name="product_picture"/> </entity> </document> </dataConfig> |
第四步:重启tomcat
//复杂查询索引 @Test publicvoid queryIndex2() throws Exception { //创建连接 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr"); //创建一个query对象 SolrQuery query = new SolrQuery(); //设置查询条件 query.setQuery("钻石"); //过滤条件 query.setFilterQueries("product_catalog_name:幽默杂货"); //排序条件 query.setSort("product_price", ORDER.asc); //分页处理 query.setStart(0); query.setRows(10); //结果中域的列表 query.setFields("id","product_name","product_price","product_catalog_name","product_picture"); //设置默认搜索域 query.set("df", "product_keywords"); //高亮显示 query.setHighlight(true); //高亮显示的域 query.addHighlightField("product_name"); //高亮显示的前缀 query.setHighlightSimplePre("<em>"); //高亮显示的后缀 query.setHighlightSimplePost("</em>"); //执行查询 QueryResponse queryResponse = solrServer.query(query); //取查询结果 SolrDocumentList solrDocumentList = queryResponse.getResults(); //共查询到商品数量 System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound()); //遍历查询的结果 for (SolrDocument solrDocument : solrDocumentList) { System.out.println(solrDocument.get("id")); //取高亮显示 String productName = ""; Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting(); List<String> list = highlighting.get(solrDocument.get("id")).get("product_name"); //判断是否有高亮内容 if (null != list) { productName = list.get(0); } else { productName = (String) solrDocument.get("product_name"); }
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"));
} } |
设置拷贝域
<!-- 故障名称--> <field name="fault_name" type="text_ik" indexed="true" stored="true"/> <!-- 故障原因--> <field name="fault_reason" type="text_ik" indexed="true" stored="true"/> <!-- 排故建议--> <field name="fault_solve" type="text_ik" indexed="true" stored="true"/> <!-- 综合查询--> <field name="fault_all" type="text_ik" indexed="true" stored="true" multiValued="true"/> <!-- 将fault_name的分词复制到fault_reason、fault_solve中 按照fault_name检索时会检索这两个字段 --> <defaultSearchField>fault_all</defaultSearchField> <solrQueryParser defaultOperator="AND"/> <copyField source="fault_name" dest="fault_all"/> <copyField source="fault_reason" dest="fault_all"/> <copyField source="fault_solve" dest="fault_all"/>
查询语句 多字段高亮显示 多域名查询
//创建查询语句 SolrQuery query = new SolrQuery(); //设置关键字 if(keyword == null || keyword.equals("")){ keyword = "*:*"; } query.setQuery(keyword); //设置查询域 query.set("df", "fault_all"); //设置高亮展示 query.setHighlight(true); //添加高亮展示域名 query.addHighlightField("fault_name"); query.addHighlightField("fault_reason"); query.addHighlightField("fault_solve"); //设置前缀 query.setHighlightSimplePre("<font style=\"color:red\">"); //设置后缀 query.setHighlightSimplePost("</font>"); //获得返回值 QueryResponse response = solrServer.query(query); //获取结果集 SolrDocumentList results = response.getResults(); //获得高亮显示结果集 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); List<FaultModel> list = new ArrayList<>(); for (SolrDocument fault : results) { FaultModel faultModel1 = new FaultModel(); faultModel1.setId(String.valueOf(fault.get("id"))); faultModel1.setFaultName(String.valueOf(fault.get("fault_name"))); faultModel1.setFaultReason(String.valueOf(fault.get("fault_reason"))); faultModel1.setSolveSuggestion(String.valueOf(fault.get("fault_solve"))); List<String> nameList = highlighting.get(fault.get("id")).get("fault_name"); if( nameList != null && nameList.size() > 0 ){ //如果有高亮显示 显示名称 faultModel1.setFaultName(nameList.get(0)); }else{ //如果没有正常显示 faultModel1.setFaultName(String.valueOf(fault.get("fault_name"))); } List<String> reasonList = highlighting.get(fault.get("id")).get("fault_reason"); if( reasonList != null && reasonList.size() > 0 ){ //如果有高亮显示 显示名称 faultModel1.setFaultReason(reasonList.get(0)); }else{ //如果没有正常显示 faultModel1.setFaultReason(String.valueOf(fault.get("fault_reason"))); } List<String> solveList = highlighting.get(fault.get("id")).get("fault_solve"); if( solveList != null && solveList.size() > 0 ){ //如果有高亮显示 显示名称 faultModel1.setSolveSuggestion(solveList.get(0)); }else{ //如果没有正常显示 faultModel1.setSolveSuggestion(String.valueOf(fault.get("fault_solve"))); } list.add(faultModel1); } return list;