solr搜索服务的使用

1. 了解搜索技术

1.1 搜索引擎

所谓搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术。搜索引擎依托于多种技术,如网络爬虫技术、检索排序技术、网页处理技术、大数据处理技术、自然语言处理技术等,为信息检索用户提供快速、高相关性的信息服务。搜索引擎技术的核心模块一般包括爬虫、索引、检索和排序等,同时可添加其他一系列辅助模块,以为用户创造更好的网络使用环境。 [1]

一个搜索引擎由搜索器 、索引器 、检索器 和用户接口 四个部分组成。搜索器的功能是在互联网 中漫游,发现和搜集信息。索引器的功能是理解搜索器所搜索的信息,从中抽取出索引项,用于表示文档 以及生成文档库的索引表。检索器的功能是根据用户的查询在索引库中快速检出文档,进行文档与查询的相关度评价,对将要输出的结果进行排序,并实现某种用户相关性反馈机制。用户接口的作用是输入用户查询、显示查询结果、提供用户相关性反馈机制。

1.2 搜索引擎发展史

Google:1998年10月之前,Google只是美国斯坦福大学的一个小项目。1995年博士生Larry Page开始学习搜索引擎设计,于1997年9月15日注册了google.com 的域名。

百度:2000年1月,两位北大校友,李彦宏与好友徐勇在北京中关村创立了百度公司。

雅虎:1994年4月,斯坦福(Stanford)大学的两名博士生,美籍华人杨致远和美国人David Filo共同创办了超级目录索引(Yahoo),并成功地使搜索引擎的概念深入人心。从此搜索引擎进入了高速发展时期。

新浪:1998年12月1日,四通利方信息技术有限公司和华渊资讯公司宣布合并,成立新浪网公司并推出同名的中文网站。其搜索引擎技术的合作对象是百度公司。

搜狐:1998年2月,爱特信公司创办了“搜狐”大型中文网络系统。搜狐站点的内容大量采用了人工选择和分类,并提供“分类查询”和“关键词”两种方式检索。其搜索引擎技术的合作对象是百度公司。

1.3 搜索引擎的原理(搜集器、索引器、检索器、用户接口)

在这里插入图片描述

1.3.1 爬行

搜索引擎是通过一种特定规律的软件跟踪网页的链接,从一个链接爬到另外一个链接,像蜘蛛在蜘蛛网上爬行一样,所以被称为“蜘蛛”也被称为“机器人”。搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容。

1.3.2 抓取存储

搜索引擎是通过蜘蛛跟踪链接爬行到网页,并将爬行的数据存入原始页面数据库。其中的页面数据与用户浏览器得到的HTML是完全一样的。搜索引擎蜘蛛在抓取页面时,也做一定的重复内容检测,一旦遇到权重很低的网站上有大量抄袭、采集或者复制的内容,很可能就不再爬行。

1.3.3 预处理

搜索引擎将蜘蛛抓取回来的页面,进行各种步骤的预处理,包括:提取文字,中文分词,去停止词,消除噪音(搜索引擎需要识别并消除这些噪声,比如版权声明文字、导航条、广告等……),正向索引,倒排索引,链接关系计算,特殊文件处理。

除了HTML 文件外,搜索引擎通常还能抓取和索引以文字为基础的多种文件类型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我们在搜索结果中也经常会看到这些文件类型。 但搜索引擎还不能处理图片、视频、Flash 这类非文字内容,也不能执行脚本和程序。

1.3.4 排名

用户在搜索框输入关键词后,排名程序调用索引库数据,计算排名显示给用户,排名过程与用户直接互动的。但是,由于搜索引擎的数据量庞大,虽然能达到每日都有小的更新,但是一般情况搜索引擎的排名规则都是根据日、周、月阶段性不同幅度的更新。

1.4 搜索技术的应用场景

搜索引擎广泛应用在大型综合搜索网站,如百度,谷歌等,也应用于系统的站内搜索(针对海量数据)。

1.5 实现搜索技术的方式

实现搜索技术可以从数据库本身出发,使用数据库的搜索命令来进行搜索,但是这种搜索的方式往往面临在数据量很大的情况下,模糊搜索不一定走索引,因此效率就会很低。

除此之外就是使用Lucene搜索技术,解决在海量数据的情况下,利用倒排索引技术,实现快速的搜索、打分、排序等功能。

2. Lucene、Solr概述

2.1 什么是Lucene

作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。apache软件基金会的网站使用了Lucene作为全文检索的引擎,IBM的开源软件eclipse的2.1版本中也采用了Lucene作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere中也采用了Lucene。Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。

Lucene是一个高性能、可伸缩的信息搜索(IR)库。它可以为你的应用程序添加索引和搜索能力。Lucene是用java实现的、成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许可 [ASF, License]。同样,Lucene是当前非常流行的、免费的Java信息搜索(IR)库。

2.2 全文检索和倒排索引

​ 计算机程序一个文档一个文档的扫描,对于每一个文档,从头看到尾,对每一词建立一个索引,指明该词在文章中出现的次数和位置,当用户查找数据时,索引程序就根据事先建立的索引进行查找,并将查找结果反馈给用户的检索方式。

2.3 Lucene与Solr的关系

​ Lucene是一套实现了全文检索的底层API,提供对于全文检索的基础支持,而Solr是全文检索引擎的一个实现产品,是一个企业级搜索应用服务器。

​ Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

3.Solr使用

3.1.下载

https://lucene.apache.org/solr/downloads.html

3.2.解压

在这里插入图片描述
在这里插入图片描述

3.3.启动、关闭、重启相关命令

启动

在bin目录下执行以下命令:

solr start

测试:(8983默认端口)

http://localhost:8983/solr/#/

创建索引库(必须服务启动)

solr create -c 索引库名字

停止

关闭指定端口的solr服务
solr stop -p 8983
关闭所有
solr stop -all

重启

solr restart -p 8983

3.4.文档的默认字段、默认数据类型

当前索引库目录下(solr-8.4.1\server\solr\mycore\conf)存在一个managed-schema文件,在该文件下定义了当前索引库的所有支持的字段以及数据类型,如果需要拓展字段,则需要修改该配置文件

<!-- 定义字段
		默认字段建议不要修改,因为有些字段是solr默认使用的字段
		name:字段名称
		type:字段类型
		indexed:是否建立索引
		stored:是否存储
		required:是否必须
		multiValued: 是否多值
	-->
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <!-- docValues are enabled by default for long type so we don't need to index the version field  -->
    <field name="_version_" type="plong" indexed="false" stored="false"/>

    <!-- If you don't use child/nested documents, then you should remove the next two fields:  -->
    <!-- for nested documents (minimal; points to root document) -->
    <field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
    <!-- for nested documents (relationship tracking) -->
    <field name="_nest_path_" type="_nest_path_" /><fieldType name="_nest_path_" class="solr.NestPathField" />

    <field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>

	<!-- 动态字段  a_i  ab_i  ccc_i  -->
	 <dynamicField name="*_i"  type="pint"    indexed="true"  stored="true"/>
    <dynamicField name="*_is" type="pints"    indexed="true"  stored="true"/>
...
<!-- 声明主键、唯一键 -->
<uniqueKey>id</uniqueKey>

<!--定义数据类型 -->
<fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true" />
    <fieldType name="strings" class="solr.StrField" sortMissingLast="true" multiValued="true" docValues="true" />
...
  • 注意:虽然新版本在新增文档时,如果配置文件中没有定义字段,则会在配置文件中自动添加该字段,但是建议还是在使用之前手动配置我们需要的字段,以及对应的数据类型,否则将会采用默认配置

3.5.IK分词器集成

目前大多solr默认字段都是采用的StandardTokenizerFactory,标准分词器,该分词器是不支持中文分词的,所以,我们需要集成支持的中文的分词器 IK分词器

https://github.com/magese/ik-analyzer-solr

  • 1.下载分词器的jar包

  • 2.当前solr服务集成ik分词器

在D:\Develop\solr-8.4.1\server\solr-webapp\webapp\WEB-INF\lib目录下添加ik分词器的jar包

  • 3.在managed-schema文件添加ik分词器类型
<!-- 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>
  • 4.添加自定义字段,并指定类型为text_ik
<field name="mytitle" type="text_ik" indexed="true" stored="true" multiValued="false"/>
  • 5.重启solr服务

4.SpringBoot整合Solr

  • 创建SpringBoot项目,添加指定启动器

在这里插入图片描述

  • 添加solr索引库配置
# 指定需要操作的solr的索引库
spring.data.solr.host=http://localhost:8983/solr/mycore
  • Solr操作->索引库操作,索引库进行增删改查操作
	//SpringBoot + JDBC  JDBCTemplate
    //SpringBoot + Redis RedisTemplate
    
    //SpringBoot + Solr SolrClient SpringBoot与Solr整合后,提供了一个SolrClient工具类对象进行索引操作
    @Autowired
    private SolrClient solrClient;
  1. 新增索引
//新增索引
    public void addIndex() {
        //1.创建一个文档对象(一个文档中有多个字段)
        SolrInputDocument document = new SolrInputDocument();
        //2.给文档对象对象添加字段  参数:字段名称,字段的值
        document.addField("id", 10);
        document.addField("name", "《西游记》");
        document.addField("author", "吴承恩");
        document.addField("description", "该书将的是一只猴子,一头猪,两个和尚的故事");
        try {
            //3.将文档添加到索引库
            solrClient.add(document);
            //4.提交操作
            solrClient.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.新增索引(方式二)

创建实体类:

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Book {
    @Field
    private String id;
    @Field
    private String name;
    @Field
    private String author;
    @Field
    private String description;
}

新增操作

/*
    BindingException: class: class com.igeekhome.solrdemo.pojo.Book does not define any fields.
    需要给对象中需要添加到索引库的属性,指定@Field注解,标明当前字段需要添加到索引库
     */
    public void addIndex_v2() {
        //1.创建Book对象
        Book book = new Book("11", "《Java从入门到放弃》", "佚名", "该书描述的是一群苦逼程序员的奋斗史");

        try {
            //2.直接添加对象
            solrClient.addBean(book);
            //3.提交
            solrClient.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SolrServerException e) {
            e.printStackTrace();
        }
    }

…其他操作下午补全,更新

//2.直接添加对象
        solrClient.addBean(book);
        //3.提交
        solrClient.commit();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SolrServerException e) {
        e.printStackTrace();
    }
}

...其他操作下午补全,更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值