搜索引擎:Solr

(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&amp;serverTimezone=Asia/Shanghai&amp;autoReconnect=true&amp;useSSL=false&amp;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();

    }

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容