solr是java开发的一款基于luence的服务器,
一、搭建步骤
第一步:把solr 的压缩包上传到Linux系统
第二步:解压solr。 (默认bin下启动的为jetty容器启动 contrib目录为拓展包 docs为文档 dist下为war包solrj-lib)
第三步:安装Tomcat,解压缩即可。
第四步:把solr部署到Tomcat下。(dist下的war包)
第五步:解压缩war包。启动Tomcat解压,关闭tomcat并将原来的war包删除(如果不关闭就删除会导致解压的文件也会删除)
第六步:把/root/solr-4.10.3/example/lib/ext目录下的所有的jar包(日志包),添加到solr工程中。
[root@localhost ext]# cp * /root/solr-4.10.3/example/lib/ext /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
第七步:创建一个solrhome。/example/solr目录就是一个solrhome。复制此目录到/usr/local/solr/solrhome
/root/solr-4.10.3/example
[root@localhost example]# cp -r solr /usr/local/solr/solrhome
第八步:关联solr及solrhome。需要修改solr工程的web.xml文件。
第九步:启动Tomcat
http://192.168.25.154:8080/solr/
二、配置业务域
1、把中文分词器添加到工程中
把IKAnalyzer2012FF_u1.jar添加到solr工程的lib目录下
把扩展词典、配置文件放到solr工程的WEB-INF/classes目录下。
2、配置一个FieldType,制定使用IKAnalyzer(添加自己的分析器)
修改schema.xml文件
修改Solr的schema.xml文件,添加FieldType: 只有textField类型才能自定义分析器,所以class用solr.TextField
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
3、配置业务域
type使用自定义的FieldType 设置业务系统Field id不用写进去,type表示采用哪种分析器不用分析器的话选择哪种数据类型, stored是否存储,indexed是否成为检索对象
<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_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"/>
这里注意如果为日期值,那么最好就成String然后将日期转为字符创传入
四、使用solrj导入值
首先在Spring生成bean对象,并调用构造方法
<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg index="0" value="http://192.168.25.131:8080/solr/collection1"></constructor-arg>
</bean>
然后调用solrj操作提交索引
@Autowired
private SolrServer solrServer;
public MessageInfo updateIndex() {
MessageInfo messageInfo = new MessageInfo();
//查询所有的维修记录 并添加到索引库
try {
List<UpdateIndexVo> list =repairDeclarationsurfaceMapper.findAllIndex();
for (UpdateIndexVo vo : list) {
SolrInputDocument document = new SolrInputDocument();
document.addField("ri_equipmentCode", vo.getEquipment_Code());
System.out.println(vo.getEquipment_Code());
document.addField("ri_equipmentName", vo.getEquipment_Name());
document.addField("ri_model_number", vo.getModel_Number());
document.addField("ri_eqipment_type", vo.getEquipment_Type());
document.addField("ri_department", vo.getDepartment());
document.addField("ri_location", vo.getLocation());
document.addField("ri_report_time", vo.getReport_Time());
System.out.println(vo.getReport_Time());
document.addField("ri_finish_time", vo.getFinish_Time());
document.addField("ri_fault_sketch", vo.getFault_Sketch());
document.addField("ri_repair_sketch", vo.getRepair_Sketch());
document.addField("ri_fault_location", vo.getFaultLocation());
document.addField("id", vo.getId());
solrServer.add(document);
}
solrServer.commit();
messageInfo.setStates(200);
messageInfo.setMessage("索引库重建成功");
messageInfo.setMessage("索引库重建成功");
} catch (Exception e) {
messageInfo.setMessage("索引库重建失败");
messageInfo.setStates(204);
e.printStackTrace();
}
return messageInfo;
}
提交成功后,后台查询与删除数据
点击query不输入条件 点击executre Query执行查询查询所有的数据,
q的意思为 *:* 查询所有 id:45 表明查询id为45的
df(defaultFiled)为默认搜索域 如果在q中不写"*:*那么默认搜索text(在conf中solrconfig.xml中进行配置
删除数据点击documents 使用xml格式的
<delete>
<id>45</id>
</delete>
<commit/>
使用solrj查询数据:
query.set("q","*:*"); 设置q的条件为"*:*" // 其他的也一样 默认记录数量就是10条
QueryResponse queryResponse = solerServer.query(query);//进行查询
SolrDocumentList solrDocumentList = queryResponse.getResults(); //获得文档列表,
solrDocumentList getNumFound(); //总数 也可以遍历 这个list就是一个arraylist
对于自定义词汇如下
在Tomcat下webapp下solr工程下的classes文件夹下
打开IKAnalyzer.cfg,xml文件
配置自己拓展文件的位置以及拓展停止字典的位置即可。字典里面每一个自定义字段一行即可
solr高亮显示
for (SolrDocument solrDocument : solrDocumentList) {
FindRepairDeclarationIntellignetVo vo = new FindRepairDeclarationIntellignetVo();
//取参数
vo.setRepairCode((String) solrDocument.get("ri_repairCode"));
vo.setEquipment_Code((String) solrDocument.get("ri_equipmentCode"));
vo.setEquipment_Name((String) solrDocument.get("ri_equipmentName"));
vo.setModel_Number((String) solrDocument.get("ri_model_number"));
vo.setEquipment_Type((String) solrDocument.get("ri_equipment_type"));
RiDepartment riDepartment = RiDepartmentMapper.selectByPrimaryKey(Integer.valueOf((String)solrDocument.get("ri_department")));
if(riDepartment!=null){
vo.setDepartmentName(riDepartment.getDepartmentname());
}
vo.setLocation((String) solrDocument.get("ri_location"));
vo.setReport_Time((String) solrDocument.get("ri_report_time"));
vo.setFinish_Time((String) solrDocument.get("ri_finish_time"));
vo.setId((String) solrDocument.get("id"));
vo.setFaultLocation((String) solrDocument.get("ri_fault_location"));
vo.setFaultpatternName((String) solrDocument.get("ri_fault_pattern"));
vo.setRepair_Sketch((String) solrDocument.get("ri_repair_sketch"));
vo.setFaultLocation((String) solrDocument.get("ri_fault_location"));
vo.setFault_Sketch((String) solrDocument.get("ri_fault_sketch"));
//对维修的内容有高亮取高亮
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
Map<String, List<String>> map = highlighting.get(solrDocument.get("id"));
List<String> list = map.get("ri_fault_sketch");
if(list!=null&&list.size()!=0){
String ri_fault_sketch = list.get(0);
vo.setFault_Sketch(ri_fault_sketch);
}
List<String> list2 = map.get("ri_repair_sketch");
if(list2!=null&&list2.size()!=0){
String ri_repair_sketch = list2.get(0);
vo.setRepair_Sketch((ri_repair_sketch));
}
List<String> list3 = map.get("ri_fault_location");
if(list3!=null&&list3.size()!=0){
String ri_fault_location = list3.get(0);
vo.setFaultLocation(ri_fault_location);
}
IntellignetVoList.add(vo);
}
条件组合查询
String params = "(title:笔记 OR content:笔记) AND catalog_id:2";
SolrQuery query = new SolrQuery();
query.setQuery(params);