先学习solr包解释
contrib 第三方组件
dist 发行版 汇总了其他文件夹的东西,包含一些大数据的东西
doc 开源的授权协议
examp 放案例 , 如: webapps有solr的站点文件 solr.war solr下有solr_home等等 multicore下有多collection的案例,可以直接拷贝参考
总结:文件夹内容会有重复
tomcat下solr搭建参考
https://blog.csdn.net/qq_24874939/article/details/84776847
solr的增量更新参考
https://blog.csdn.net/weixin_38970805/article/details/83144036
总结:
solr分词器参考
https://blog.csdn.net/qq_36957885/article/details/102369917
总结容易遇到的坑:
tomcat下solr搭建:我用的是solr8.4.1+tomcat9.0.3
这里主要遇到以下坑(1)在拷贝solr的相关jar包到WEB-INF\lib下的时候包可能会有重复,在这里要进行覆盖,具体原因不是很明白,在这里ext和另外metrics的4个包,还有一个javax的包,这里注意
(2)配置文件
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:\Java Web\apache-tomcat-9.0.30\webapps\solr\solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
这里还是复制,我自己手打错了找了很久才找到问题。。。
完了就是要注释:这是一个关于solr的权限的
分词器这个就简单了
主要配置Ik包,以及\WEB-INF\classes 下的IKAnalyzer.cfg.xml,kgc_dict.dic,ext_stopword.dic在这里注意名字必须与xml中对得上,这里主要是用于给IK添加分词规则和一些词忽略不进行分词的
增量更新:
最坑的是在solrhome/conf /dataimport-properties放增量时间配置文件和外面的同时也要在solrhom/自己的索引文件/dataimport-properties放记录最后更新的时间的文件,这个配置文件很重要,它是用来记录当前时间与上一次修改时间的,通过它能够找出,那些,新添加的,修改的,或删除的记录在进行增量索引前,
增量更新要弄懂几个必要的属性,以及数据库建表事项,和dataimporter.properties
还有以下必须好好理解否者我是找不到为啥一分钟不能自动更新的。
这里是最重要的一点data-config.xml里面的数据
transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签
query:查询数据库表符合记录数据
deltaQuery:增量索引查询主键ID
注意这个只能返回ID字段
deltaImportQuery:增量索引查询导入数据
deletedPkQuery:增量索引删除主键ID查询
注意这个只能返回ID字段
数据库配置注意事项
1.如果只涉及添加,与修改业务,那么数据库里只需额外有一个timpstamp字段
就可以了,默认值为当前系统时间,CURRENT_TIMESTAMP(笔者的数据为mysql的)
2.如果还涉及删除业务,那么数据里就需额外再多添加一个字段isdelete,int类型的
用0,1来标识,此条记录是否被删除,当然也可以用其他字段标识,ture或false都可以
然后就是java操作solr这里先把数据导入
直接访问solr的url
package test;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.QueryResponse;
import pojo.Hotel;
import java.io.IOException;
import java.util.List;
/**
* @ClassName SolrjDemo
* @Description
* @Author hua_wen
* @Date 2020/1/19 下午 03:23
**/
public class SolrjDemo
{
private static String url="http://localhost:8080/solr/hotel";
public static void main(String[] args) throws IOException, SolrServerException
{
//连接solr,return this 方法链
HttpSolrClient client = new HttpSolrClient(url);
client.setConnectionTimeout(1000);
client.setParser(new XMLResponseParser());//响应解析器
SolrQuery query = new SolrQuery("*:*");
// query.setQuery("keyword:酒店");//q
query.addFilterQuery("address:北京");//fq
// query.addHighlightField(""); //高亮
query.setSort("hotelId",SolrQuery.ORDER.desc);
query.setStart(0);//分页
query.setRows(10);//条数
//执行查询
QueryResponse response = null;
response =client.query(query);
//解析数据
List<Hotel> result = response.getBeans(Hotel.class);
if(result==null)
{
System.out.println("no data");
}else
{
for(Hotel h : result)
{
System.out.println(h.getHotelId()+"\t"+h.getHotelName());
}
}
}
}
package pojo;
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
/**
* @ClassName Hotel
* @Description
* @Author hua_wen
* @Date 2020/1/19 下午 03:11
**/
@Data
public class Hotel implements Serializable
{
@Field
private String hotelId;
@Field
private String hotelName;
@Field
private String address;
@Field
private String country;
}
这里要注意的是solr5和solr8获得对象的方式是不同的;sorl5直接new,sorl8是new HttpSolrClient.build(),而且solr-8.0.0和 solr-7.x都不再支持long类型。而是plong类型,这里solr8.4.1的Solr包含的字段类型(除开String)都是加了个p开头的字母。关于主键id,solr默认的是String,请参考:
https://blog.csdn.net/weixin_33672109/article/details/86010787
其他字段的版本我不太清除。还有solr8是managed-schema文件没有schema.xml这里可以改成xml然后在配置中加上
<schemaFactory class="ClassicIndexSchemaFactory"/>
这两个文件的模式是不同的详细见:
https://blog.csdn.net/weixin_39082031/article/details/78932713
managed-schema的介绍:http://www.manongjc.com/article/34126.html
查出来效果图
并且每次访问黑窗口 tomcat服务器都会接受到请求