solr基本配置与sorlJ基本使用(单机)
引用别人文章(写的比我好):https://blog.csdn.net/u010510107/article/details/81051795
1.下载安装jdk, tomcat (略)
2.下载solr包
1.下载地址 : http://archive.apache.org/dist/lucene/solr/ 本文使用 solr-7.7.0 版
2.下载到 /usr/local/solr 下
3.解压 : tar zxvf solr-7.7.0.tgz -C /usr/local/solr
4.复制 /usr/local/solr/solr-7.7.0/server/solr-webapp/webapp 到 /usr/local/solr/apache-tomcat-8.5.24/webapps下重命名为 solr
命令:cp -r /usr/local/solr/solr-7.7.0/server/solr-webapp/webapp /usr/local/solr/apache-tomcat-8.5.24/webapps/solr
5.复制 /usr/local/solr/solr-7.7.0/server/lib/ext 下所有包 和 /usr/local/solr/solr-7.7.0/server/lib中 metrics-* 开头五个包
到 /usr/local/solr/apache-tomcat-8.5.24/webapps/solr/WEB-INF/lib 下
6.在/usr/local/solr/apache-tomcat-8.5.24/webapps/solr/WEB-INF下面创建classes文件夹,并且复制 /usr/local/solr/solr-7.7.0/server/resources下的“log4j.properties”到新创建的这个classes中, 7.7.0版没有此日志文件,因此复制 log4j2.xml
7.需要定义一个solrhome的文件夹,当然名字也可以自拟,位置的话(/usr/local/)个人喜欢直接放tomcat下,然后将/usr/local/solr/solr-7.7.0/server/solr下面的所有配置文件内容复制到新创建的solrhome文件夹中
8.修改/usr/local/solr/apache-tomcat-8.5.24\webapps\solr\WEB-INF\下的web.xml 将以下注释打开或者直接复制这段配置然后修改一下路solrhome的路径
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
9.然后保存后启动tomcat 默认访问路径:localhost:8080/solr/index.html
注:如果访问出现403的情况那么就试试将刚才进行修改的web.xml文件中的下图内容注释掉,一般在最后的位置,如下:
10.成功界面
中文分词解析,ik分词器包下载
相关连接: https://search.maven.org/search?q=g:com.github.magese AND a:ik-analyzer&core=gav
1.打开已经解压的ik分词器文件夹
复制jar包到apache-tomcat-8.5.24\webapps\solr\WEB-INF\lib下 :
相关连接 https://blog.csdn.net/guyan0319/article/details/81188977
2.创建solr实例
(1)方式一 : mkdir /usr/local/solr/solrhome/ik
复制配置文件 cp -r /usr/local/solr/solrhome/configsets/_default/conf /usr/local/solr/solrhome/ik/
(2)方式二:
3.然后到/usr/local/solr/solrhome/ik/conf目录中打开managed-schema文件,增加如下代码:
<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
使用tomcat方式访问solr,重启tomcat 即可, 如果是solr自启动(bin/solr restart -force) localhost:8983/solr/index.html
使用text_ik分析中文:
solr基本增删改使用
xml格式添加索引 :
<add>
<doc>
<field name="gameId">05991</field>
<field name="gameName" update="add">angrybird</field>
<field name="skills" update="add">fly</field>
<field name="skills" update="add">dump</field>
</doc>
</add>
json格式添加索引:{"jsonId":"9527","jsonName":"ok168"}
查询索引: 相关语法 https://www.jianshu.com/p/e25f8bcfc694
q 查询全部 : *:*
模糊查: id:*111*
hl 设置高亮:
删除索引:
<delete>
<query> jsonId:"9527"</query>
</delete>
<delete><id>110</id></delete>
<commit/>
配置solrJ代码操作solr索引
maven pom:
<!--solr 全文检索 客户端-->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.3</version>
</dependency>
springboot方式配置solr:
@Configuration
public class SolrConfig {
private static final String solrServerUrl = "http://192.168.10.40:8080/solr/ik";
@Bean
public HttpSolrServer solrServer(){
HttpSolrServer solrServer= new HttpSolrServer(solrServerUrl);
solrServer.setParser(new XMLResponseParser());
solrServer.setMaxRetries(1);
solrServer.setConnectionTimeout(500);
return solrServer;
}
}
bean方式添加索引dto
public class SolrDto {
@Field
private Long id;
@Field("userName")
private String userName;
@Field
private String userPhone;
@Field
private String userAddress;
private String userDesc;
// <field name="id" type="int" indexed="true" stored="true" multiValued="false" required="true"/>
@Field
private Set<Integer> testMutiValued; //测试 MutiValued 字段
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPhone() {
return userPhone;
}
public void setUserPhone(String userPhone) {
this.userPhone = userPhone;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public String getUserDesc() {
return userDesc;
}
public void setUserDesc(String userDesc) {
this.userDesc = userDesc;
}
public Set<Integer> getTestMutiValued() {
return testMutiValued;
}
public void setTestMutiValued(Set<Integer> testMutiValued) {
this.testMutiValued = testMutiValued;
}
}
@Controller
public class SolrController extends BaseController {
@Autowired
@Qualifier("solrServer")
private HttpSolrServer solrServer;
@Autowired
private IUserService userService;
/**
* 数据导入(添加)
* @return
*/
@RequestMapping("/solr/dataImport")
@ResponseBody
public ResponseData solrDataImport() throws IOException, SolrServerException {
//查询数据库的用户列表
List<User> users = userService.select(new User(), 1, Integer.MAX_VALUE);
if(!CollectionUtils.isEmpty(users)){
SolrDto dto = new SolrDto();
dto.setId(1L);
dto.setUserName("test");
dto.setUserPhone("123");
dto.setUserAddress("shanghai");
Set<Integer> set = Sets.newHashSet(1,2,3);
dto.setTestMutiValued(set);
//bean方式
solrServer.addBean(dto);
//单个属性方式
for (User user : users) {
//创建文档对象
SolrInputDocument document = new SolrInputDocument();
document.addField("userName", user.getUserName());
document.addField("id", user.getUserId());
document.addField("userPhone", user.getPhone());
document.addField("userAddress", user.getAddress());
document.addField("userDesc", user.getDescription());
//文档对象写入索引库
solrServer.add(document);
}
//提交
solrServer.commit();
}
System.out.println("solrDataImport 导入成功!");
return new ResponseData();
}
@RequestMapping("/solr/dataQuery")
public void queryDocument() throws SolrServerException, IOException{
String keywords = "CH000";
//创建一个查询对象
SolrQuery query = new SolrQuery();
//设置查询条件
//query.setQuery("*:*");
query.setQuery("userName:*"+keywords+"*");
//是否需要高亮
boolean isHighlighting = !StringUtils.equals("*", keywords) && StringUtils.isNotEmpty(keywords);
if (isHighlighting) {
// 设置高亮
query.setHighlight(true); // 开启高亮组件
query.addHighlightField("userName");// 高亮字段
query.setHighlightSimplePre("<em>");// 标记,高亮关键字前缀
query.setHighlightSimplePost("</em>");// 后缀
}
query.setStart(0); //开始页
query.setRows(6); //显示行数
query.setSort("id", SolrQuery.ORDER.desc); //排序
query.setFields("id","userName","userPhone","userAddress"); //显示的字段
//query.addField();
//执行查询
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("userName"));
System.out.println(solrDocument.get("userPhone"));
System.out.println(solrDocument.get("userAddress"));
System.out.println("--------------------------");
}
System.out.println("queryDocument 查询成功!");
}
/**
* 更新索引
*/
@RequestMapping("/solr/dataUpdate")
public void updateDocument() throws SolrServerException, IOException{
SolrInputDocument doc = new SolrInputDocument();
Long id = 10001L;
doc.addField("id", id);
doc.addField("userDesc", "描述");
UpdateResponse rsp = solrServer.add(doc);
System.out.println("update doc id:" + id + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
UpdateResponse rspCommit = solrServer.commit();
System.out.println("commit doc to index" + " result:" + rspCommit.getStatus() + " Qtime:" + rspCommit.getQTime());
}
/**
* 删除有多种操作方式,可以通过id,id List,甚至query语句
* @throws SolrServerException
* @throws IOException
*/
@RequestMapping("/solr/dataDelete")
public void deleteDocument() throws SolrServerException, IOException{
solrServer.deleteById("1"); //通过id删除
//solrServer.deleteByQuery("*:*"); //通过语句删除
solrServer.commit();
System.out.println("dataDelete 删除成功!");
}
}
首个文档,不足之处请多包涵