概述
简介
Solr是一个基于Lucene的Java搜索引擎服务器,Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。solr解决了sql在查询性能上的问题,比如搜索商品,过多商品通过like关键字甚至加上其他更复杂语句会导致性能问题。
安装
下载
官网下载解压即可
bin:solr的命令文件
contrib:solr的插件
dist: solr的jar包
docs: solr文档
example: solr示例
licenses: solr证书
server: solr服务器核心文件
启动solr
在使用前必须安装JDK,然后shell进入bin目录:输入solr start
打开网页http://localhost:8983/solr访问进入solr页面即安装完成。
其它命令:
solr start –p 端口号 单机版启动solr服务(默认端口号8983)
solr restart –p 端口号 重启solr服务
solr stop –p 端口号关闭solr服务
使用
创建core(核心)
Solr核心(Core)是Lucene索引的运行实例,每个core下都有自己的索引库和与之相应的配置文件。
1.进入bin目录执行solr create –c name即可,core存放在server/solr下,删除core时执行
solr delete -c name。
2.solr的控制面板创建
索引
索引使用户能够在文档中快速地查找信息。我们可以索引(添加,删除,修改)各种文档格式。在查询之前要添加数据。
- 命令提交:post -c coreName(要提交到的核心) file(要提交的文件,可以提交xml测试)
<add>
<doc>
<field name = "id">1001</field>
<field name = "name">zhangsan</field>
<field name = "age">18</field>
</doc>
<doc>
<field name = "id">1002</field>
<field name = "name">lisi</field>
<field name = "age">20</field>
</doc>
</add>
add:添加文档根节点
doc:文档内容
field:设置名称和值
- solr控制面板提交:
- 使用java代码提交
配置schema
schema指定了如何建立索引,其配置文件在创建的core下的conf文件夹下,名为managed-schema。
- field:创建索引用的字段
- fieldType:为field定义类型,最主要作用是定义分词器,分词器决定着如何从文档中检索关键字。
- analyzer:分词器,他由一组tokenizer和filter组成
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
indexed:是否索引,true表示要索引,索引的目的为了搜索。
stored:是否存储,存储的目的是为了从索引文件读取数据
required:设置为true时,当字段没有值,则solr会索引文档失败
type:是指定的fieldType的name
配置中文分词器(IKAnalyzer)下载:https://github.com/magese/ik-analyzer-solr7
jar包下载https://mvnrepository.com/artifact/com.github.magese/ik-analyzer-solr7/7.x
按照github配置即可
solr导入mysql数据
- 数据库建表
- 复制dist文件夹下的solr-dataimporthandler-7.6.0.jar和solr-dataimporthandler-extras-7.6.0.jar到
E:\solr-7.6.0\server\solr-webapp\webapp\WEB-INF\lib下。 - 在所在核心下的conf文件夹下新建data_config.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<dataConfig>
<!-- 数据源 -->
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/solr"
user="root" password="123456"/>
<document>
<!-- 查询实体 -->
<entity name="user" query="select * from user" deltaQuery="select * from user">
<!-- 字段 -->
<field name="id" column="id"/>
<field name="name" column="name"/>
<field name="age" column="age"/>
</entity>
</document>
</dataConfig>
- 编辑solrconfig.xml加入requestHandler
<requestHandler name="/selectUser" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data_config.xml</str>
</lst>
</requestHandler>
- 编辑managed-schema配置field,id已存在无需配置
<field name="name" type="string" indexed="true" stored="true"/>
<field name="age" type="string" indexed="true" stored="true"/>
- 最后重启solr,进入solr面板导入数据。
solrj的使用
添加maven依赖,版本根据个人需要改变
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.6.0</version>
</dependency>
不使用注解
- 查询:
HttpSolrClient solrClient;
@Before
public void conn(){
solrClient=new HttpSolrClient.Builder("http://localhost:8983/solr/coreTest")
.withConnectionTimeout(6000)
.withSocketTimeout(4000)
.build();
}
@Test
public void test() throws IOException, SolrServerException {
//添加
SolrInputDocument doc=new SolrInputDocument();
doc.addField("id",1001);
doc.addField("name","jack");
doc.addField("age",15);
solrClient.add(doc);
solrClient.commit();
//删除
solrClient.deleteById("1001");
//查询
SolrQuery solrQuery=new SolrQuery();
solrClient.commit();
solrQuery.set("q","id:*");
QueryResponse query = solrClient.query(solrQuery);
SolrDocumentList results = query.getResults();
results.forEach(solrDoc-> {
User user=new User();
user.setId(Long.parseLong((String) solrDoc.get("id")));
user.setName((String) solrDoc.get("name"));
user.setAge(Integer.parseInt((String) solrDoc.get("age")));
System.out.println(user.toString());
});
}
使用注解@Field
@Data
public class User {
@Field
private Long id;
@Field
private String name;
@Field
private int age;
}
添加文档
HttpSolrClient solrClient=new HttpSolrClient.Builder("http://localhost:8983/solr/coreTest")
.withConnectionTimeout(6000)
.withSocketTimeout(4000)
.build();
User user=new User();
user.setId("1002");
user.setName("tony");
user.setAge(20);
solrClient.addBean(user);
solrClient.commit();