
(1)理论基础
全文检索
数据总体分为两种:结构化数据和非结构化数据。
1)结构化数据:指具有固定格式或有限长度的数据,如数据库等。
2)非结构化数据:指不定长或无固定格式的数据,如邮件,word 文档等。非结构化数据又一种叫法叫全文数据。
按照数据的分类,搜索也分为两种:
1)对结构化数据的搜索:如对数据库的搜索,用 SQL 语句。
2)对非结构化数据的搜索:如利用 windows 的搜索也可以搜索文件内容,再如用 Google 和百度可以搜索大量内容数据。
Lucene 简介
Lucene 是一个高效的,基于 Java 的全文检索库,是一个开放源代码的全文检索引擎工具包,Lucene 提供了一个简单却强大的应用程序接口,能够做全文索引和搜寻。
在 Java 开发环境里 Lucene 是一个成熟的免费开源工具。
Solr 简介
Solr 基于 Lucene 的高性能的全文搜索服务器,是一个独立的企业级搜索应用服务器,采用 Java 开发。同时对其进行了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文检索引擎。
(2)配置
(1)设置环境变量PATH
D:\solr-8.6.0\bin
(2)启动服务
solr start
http://localhost:8983/solr
solr stop -all
(3)创建核心文档
D:\solr-8.6.0\server\solr
solr.cmd create -c solrTest
(3)Mysql导入
1 导入相关 jar包
【maven】
mysql-connector-java-8.0.30.jar
【D:\solr-8.6.0\dist】
solr-dataimporthandler-8.11.1.jar
solr-dataimporthandler-extras-8.11.1.jar
【D:\solr-8.6.0\contrib\analysis-extras\lucene-libs】
lucene-analyzers-smartcn-8.6.0.jar
D:\solr-8.6.0\server\solr-webapp\webapp\WEB-INF\lib
2 配置连接信息
【db-data-config.xml配置】
<dataConfig>
<dataSource driver="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf-8&serverTimezone=Asia/Shanghai&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" user="root" password="123456" />
<document>
<entity name="poem" query="select * from poem">
<field column="poemcontent" name="poemcontent" />
</entity>
</document>
</dataConfig>
【managed-schema配置】
<field name="poemcontent" type="text_ik" indexed="true" stored="true"/>
<!-- ChineseAnalyzer -->
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
【solrconfig.xml配置】
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
(4)SpringBoot+Solr
<!--集成solr搜索引擎客户端-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>2.4.13</version>
</dependency>
spring:
data:
solr:
host: http://127.0.0.1:8983/solr/solrTest
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
@Data
public class Poem implements Serializable {
@Field("id")
private String id;
@Field("poemcontent")
private String poemcontent;
}
@SpringBootTest
class SolrApplicationTests {
@Autowired
SolrClient solrClient;
@Test
void add() throws SolrServerException, IOException {
Poem poem = new Poem();
poem.setId("101");
poem.setPoemcontent("敕勒歌 北朝民歌");
solrClient.addBean(poem);
UpdateResponse commit = solrClient.commit();
System.out.println(commit.toString());
solrClient.close();
}
@Test
public void update() throws IOException, SolrServerException {
// 所谓Solr的更新操作,就是对相同id的文档重新添加一次。修改之后,Version变得不一样了。
Poem poem = new Poem();
poem.setId("101");
poem.setPoemcontent("敕勒歌 北朝民歌 敕勒川,阴山");
solrClient.addBean(poem);
UpdateResponse commit = solrClient.commit();
System.out.println(commit.toString());
solrClient.close();
}
@Test
public void delete() throws IOException, SolrServerException {
UpdateResponse updateResponse = solrClient.deleteById("101");
UpdateResponse commit = solrClient.commit();
System.out.println(commit.toString());
solrClient.close();
}
@Test
public void list() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery("poemcontent:春风");
//添加需要回显得内容
query.addField("id");
query.addField("poemcontent");
//设置每页显示多少条
query.setRows(20);
//执行查询返回QueryResponse
QueryResponse response = solrClient.query(query);
//获取doc文档
List<Poem> poemList=response.getBeans(Poem.class);
poemList.forEach(System.out::println);
solrClient.close();
}
}