![搜索引擎技术与发展](https://wfqqreader-1252317822.image.myqcloud.com/cover/53/35011053/b_35011053.jpg)
1.1 快速上手搜索引擎
搜索引擎的基础在于对全文索引库进行管理。例如,如果要快速搜索某路径下的文件内容,就需要建立这些文件的索引。
1.1.1 准备工作环境
首先需要准备使用Java语言的开发环境,可以从OpenJDK的官方网站https://openjdk.java.net下载JDK 11,使用默认方式安装即可。
然后准备用于编写代码的集成开发环境。例如,可以使用IntelliJ IDEA、Eclipse、Visual Studio Code或NetBeans。
如果使用IntelliJ IDEA集成开发环境,为了防止控制台输出的中文显示为乱码,可以使用HELP → Edit Custom VM OPtions命令补充参数-Dfile.encoding=UTF-8,然后重启IntelliJ IDEA。另外,可以将项目的默认编码设置为UTF-8。
IntelliJ IDEA的配置信息默认保存在C盘,如果需要修改配置信息所在的路径,可以修改idea.properties文件:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_11_1.jpg?sign=1739479503-oefUEbtBmkzf2436GD0Iw9dyW24x1VvX-0-b08d6678a74a530b2da694ff24f27136)
如果使用NetBeans集成开发环境,为了使NetBeans更好地支持UTF-8编码的源文件,可以导航到<Netbeans 安装目录>/etc,并打开 netbeans.conf 文件,在以netbeans_default_options开头的行的末尾添加-J-Dfile.encoding=UTF-8(确保包括前导空格)。重新启动NetBeans,它应该运行在UTF-8状态中。如果需要进行验证,可以使用“帮助”→“关于”命令,并检查系统。
Lucene是一个提供全文检索功能的jar包。由于单台机器的计算能力有限,因此可以采用多机集群的分布式搜索来实现高负载和高可用性。Solr 就是商用系统演化出来的基于Lucene的开源项目。
Solr搜索由服务器端和客户端组成,并且可以在单机或云模式下运行。下面介绍Solr在单机模式下的使用。
在Linux或Windows操作系统中都可以运行Solr,这里介绍在Windows操作系统中的安装与使用。从http://lucene.apache.org/solr下载solr-8.5.0版本,可以把安装文件存放在D:\soft\目录下。
使用solr.cmd命令脚本启动Solr:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_11_2.jpg?sign=1739479503-YDc2Qw9U4z9IjuA7y7oO2rN5RPHKQCyH-0-d4ae6e9b1d14b09ef533d6816794adaf)
启动Solr之后,输出结果如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_11_3.jpg?sign=1739479503-tzZeSiphn5QO20pFBTDhw1RXuoAYO5sH-0-38d7ed26612b352d9ac3908c00858eb4)
这样就启动了一个Solr实例。检查这个Solr实例的运行状态:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_11_4.jpg?sign=1739479503-NxLJEZhmzdh51f9XcH0TFk35ANnSD62l-0-767c7bbc94bc11be6bba3211baf4c388)
返回结果如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_11_5.jpg?sign=1739479503-nJjxPEfUQCjPcij3ryjP0SsoQLeZLc7h-0-8d4637cceb04e7e4d0f4c841848be5a8)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_12_1.jpg?sign=1739479503-LNyqluLnSVBj5QkjzXCEDlHUczAZINtm-0-bdd165ae9d64c6c0b926fb988ee4d302)
可以看出,一个Solr 进程监听8983端口,可以通过HTTP协议访问这个端口。如果用浏览器打开http://localhost:8983,则会跳转到Solr的管理界面。
Solr 索引库是若干文档组成的集合。Solr 中一个完整的索引叫作一个文档集合(Collection)。
创建一个叫作demo的文档集合:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_12_2.jpg?sign=1739479503-vXNYk12WziQ0ga0QkNmoFRhq7V0U2Ouy-0-e06b350eb0b33503f98cc0f90976eed2)
Solr索引库中的文档可以包含多个列。Solr索引库的结构称为Schema。例如,临床试验项目和病历对应不同的 Schema。在 Solr 索引库中可以建立临床试验项目和病历两个不同的核(Core)。
使用solr create_core命令创建一个trials核:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_12_3.jpg?sign=1739479503-KOp0GAnM4KWF2i8Frc5JUcMztNIPc0u3-0-b6ed5d64d112de7c36daa2c957139b87)
在管理界面左边的Core Admin中可以管理这些核。
如何生成一个用于搜索的全文索引将在后面进行介绍。
1.1.2 生成索引
搜索引擎的基础在于对全文索引库进行管理,为了能够快速搜索自己想要的内容,可以建立这些内容的索引。
XML文件managed-schema 定义了索引库的结构,这个文件位于 D:\soft\solr-8.2.0\server\solr\configsets\_default\conf\目录下。
为了定义索引库的结构,可以创建一个Java项目,用于向 Solr 服务器发送封装成JSON(JavaScript Object Notation)格式的数据。
这里选择使用项目构建工具Gradle来管理Java项目:首先用命令行创建一个Gradle项目,然后导入Eclipse集成开发环境。
在 Windows操作系统中,既可以使用包管理器Chocolatey(https://chocolatey.org)安装Gradle,也可以手动安装Gradle。
如果选择手动安装Gradle,就需要先下载Gradle:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_12_4.jpg?sign=1739479503-a2qAnn5UzCcK5PKzvQAv4mVRGPypoDKb-0-d977597bac16ba8adea6781897403627)
使用setx命令设置GRADLE_HOME环境变量:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_12_5.jpg?sign=1739479503-SuNCpsyhyUBgXE3gYTX8lH4Qt4YeGT9d-0-dbf74ca8c087b128c3bb4526ff9ad3cc)
为了检查GRADLE_HOME环境变量,可以打开一个新的控制台窗口,然后用echo命令进行检查:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_13_1.jpg?sign=1739479503-DT818GPpg8WwKZL7S7fhGgHguahzt7Uf-0-49e1d13a92a50d2e2e6aebe8b94edade)
或者使用set命令获取所有环境变量的列表。
可以在PowerShell控制台中设置PATH环境变量:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_13_2.jpg?sign=1739479503-hYF2MlEHn1edkf5Rk73cKqnKOUUMXOce-0-a2dc4099cee76e40ea29d9571b2c30cb)
检查PATH环境变量:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_13_3.jpg?sign=1739479503-NArlkoVFk2hlnrhbn2PUCRfJ6YVYZmYt-0-7532c6f93d0e9a71e39f5399610259f8)
检查Gradle是否安装成功:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_13_4.jpg?sign=1739479503-Uj2e3J7ei7H8dmAdPdZ1nQoYYkzD1vGW-0-7b9f8d4e4c183bd425e95b0109503aa0)
可以通过Gradle命令行新建一个Java应用项目:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_13_5.jpg?sign=1739479503-LeDN3kTUljwuaDdHBH2epWJ54tfmpWAe-0-e2815a5b7e66c7ad941d681bbdc12497)
Gradle可以从Maven存储库中下载Solr相关的jar包。为了加快对依赖项的访问速度,可以修改build.gradle文件,增加存储库:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_13_6.jpg?sign=1739479503-r83pVxxjF7U2PdBfMv5PL0tTWSuVPY0E-0-7e90ad0bc817e95c5690bc3a96c77322)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_14_1.jpg?sign=1739479503-xYN3LOMR8UQviPNxhecKdgXeyxEyI46F-0-f10f31a04159959d47cdb487014d7dcd)
在build.gradle文件中增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_14_2.jpg?sign=1739479503-AWiRUEFbyFkE2aetgFGDG7FvgqufQ66V-0-38f8ce07e66f558204d0390adf97e4be)
通过HttpPost对象使用Apache HttpClient(http://hc.apache.org)发送以JSON作为请求主体的POST请求。POST方式提交的数据没有长度限制。增加一个TEST测试列的代码如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_14_3.jpg?sign=1739479503-AGJRk5QbojBjHX4OSIFwiyaxvGvyVAYt-0-d626044608b17997d9dcecb628b7f5c1)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_15_1.jpg?sign=1739479503-6OOLb3GrYEtZViNknnDs0bsISFLAtFbB-0-6a4b3b5432c5039218271107fa62ef85)
将采用POST方式提交的数据发送给Solr服务器,从而实现封装成类:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_15_2.jpg?sign=1739479503-OTs5E4uhmrYo9nOBuIDcOFqIGB1hVhu4-0-fbed29327ace412ad1332f20fa9d4ece)
删除列:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_15_3.jpg?sign=1739479503-CPi5xW7FISRsvDr3nma1A0POqBwpnSd6-0-2c5c5f3e24124c2bd5ddeaf1f0d0032a)
增加标题(title)和内容(body)列:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_16_1.jpg?sign=1739479503-SaLWSSEKUbqm2oiagbcJfod4KpSnSQfx-0-ba6c8b2cf37ef7543469587ead081ad3)
也可以使用HTTP客户端桌面应用程序Insomnia(https://insomnia.rest)将HTTP请求发送给Solr服务器。
在Solr的Java语言客户端SolrJ中,可以使用HttpSolrClient.add(SolrInputDocument)方法写入索引库。
增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_16_2.jpg?sign=1739479503-C0Fq42OKYhkw8cWa7DPKbEWI1EBxYv1O-0-d9692eae45be5d205763e236913f5344)
可以在gradle.properties文件的配置文件中设置JDK所在的路径:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_16_3.jpg?sign=1739479503-ddJg1Pic7eynMCGTkSN9aXgOdNDxlyDC-0-fb650ae8c2cce4b51bcd5490dfd6136e)
gradle.properties文件可以位于项目根目录下或GRADLE_USER_HOME环境变量定义的gradle用户目录下。
接下来准备Eclipse集成开发环境。Eclipse有很多版本,可以选择Eclipse IDE for Java Developers版本。Eclipse无须安装,解压后就可以直接使用。可以从http://www.eclipse.org下载Eclipse安装包。
在Windows操作系统中,双击后就可以解压文件。如果需要专门的解压软件,推荐使用7z(http://www.7-zip.org)。
Eclipse 默认的是英文界面,如果需要使用中文界面,可以从 http://www.eclipse.org/babel/downloads.php下载支持中文的语言包。
为了更好地支持国际化,Eclipse中的项目往往设置成UTF-8编码。为了使Eclipse创建的项目默认采用UTF-8编码,可以执行Window → Preferences → General → Content Types命令,将Java Source File的Default encoding设置为UTF-8。
在build.gradle文件中增加使用UTF-8编码的编译选项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_17_1.jpg?sign=1739479503-l8rN3yl63ajZgCxQDgL4t7JNK8IUWIk2-0-ea519ccaecfabfb30cc3459e55e4e131)
Eclipse在工作空间中管理软件项目。将生成的Gradle项目导入Eclipse工作空间中,然后在solrapp包(package)下创建一个Indexer类:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_17_2.jpg?sign=1739479503-N5Z8cdiH7fpxvTtjMG1Tj6yz8Ff358VI-0-3392c55c4ac43e5f0055c3a0b33ee4e5)
1.1.3 关键词查询
创建一个KeywordsQuery类,通过关键词查询Solr:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_17_3.jpg?sign=1739479503-0cCqEuZPA8xjUKmh4TbND2BPmwN1W1LM-0-5d9827fb21e98163ad888e58a1cc44a2)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_18_1.jpg?sign=1739479503-7VHVyIAb84QeYNXFzok21tQHd8YSN6d0-0-c8d2daf706dafb9327f5e82c18db13ff)
可以通过ModifiableSolrParams的实例设置查询参数:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_18_2.jpg?sign=1739479503-HkGx3sqsBinppgoBlsAREm0HjHFWPV94-0-98e3c50f4588803295b7e8f89661465b)
可以让Solr把查询结果以JSON格式返回。JSON是一种很容易阅读的轻量级数据交换格式,机器很容易解析和生成,可以用它传输由名称/值对和数组数据类型组成的数据对象。
JSON格式的基本数据类型有以下几种。
● 数字:有符号的十进制数字,可能包含小数部分,可能使用指数E表示法,但不能包括非数字,如NaN。该格式不区分整数和浮点数。
● 字符串:零个或多个Unicode字符的序列。字符串用双引号分隔,并支持反斜杠转义语法。
● 布尔值:为true或false的任意一个值。
● 数组:零个或多个值的有序列表,每个值可以是任何类型。数组使用方括号符号,元素以逗号分隔。
● 对象:名称/值对的无序集合,其中名称(也称为键)是字符串。由于对象旨在表示关联数组,因此建议每个键在对象内是唯一的。对象用大括号分隔,并使用逗号分隔每对,而在每对中,冒号“:”将键或名称与其值分隔开。
● null:一个空值,使用单词null。
运行如下代码可以得到JSON格式的返回结果:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_18_3.jpg?sign=1739479503-BpzWecDGFvEqlGyXUfT3fzPOXlIFLMoo-0-5db13fcdcd415bf3795b85bdce49c7fa)
输出的JSON串是一个由响应头和响应体组成的对象,具体内容如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_19_1.jpg?sign=1739479503-ar3y14KnA31mKJ3oIhXu2mznKW498s5A-0-1b7b74cba8e4a8552457743e8a200e78)
使用SolrQuery.toQueryString()方法可以得到查询URL,代码如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_19_2.jpg?sign=1739479503-93DUrhVakhuBbBqrJmY29T6kclIw41zD-0-0378130b350e7d74cc714f025d246fd3)
输出结果如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_19_3.jpg?sign=1739479503-kcwZonzi6CGebHuH6NTqgtzd7ELtjekt-0-a8549838e96179c256047d285a8d7660)
在浏览器中输入网址 http://localhost:8983/solr/trials/select/?q=title%3A%E8%AF%95%E9%AA%8C&fl=id%2Ctitle%2Cbody,返回JSON格式的查询结果:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_19_4.jpg?sign=1739479503-Di8psuepDhqffMDD3Ge6tBVMuCtZKwtS-0-b2f6605def20b46f5f8d5f9dabd0f09c)
1.1.4 实现搜索界面
搜索结果页会对查询词高亮显示。为了使高亮返回的文本可以在浏览器中正常显示,高亮显示的文本片段需要HTML转义,然后插入高亮显示标签。例如,如果输入的是:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_19_5.jpg?sign=1739479503-Fpt4nXktOaeQnzjuzNONxVhXORGkD6Rl-0-2cb6e72165e0bcabd0ffea39c6a83028)
搜索“caption”,直接插入高亮显示标签会得到:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_20_1.jpg?sign=1739479503-LJ6p1Vmeb4rEVbtNS6ryz2ZMNaAYXXuw-0-cfef44fbd590747ee9684033f3fc294a)
但想得到的结果是:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_20_2.jpg?sign=1739479503-RozmqrB3hSu9qLCyTyZ92b0VGnjc6QIB-0-46895f36c671a30b693a4575a097c3db)
这样的效果可以通过在参数中指定HTML编码器来控制。
查询高亮显示所需的参数如下。
● hl:应设置为true,从而允许在查询响应中生成高亮显示的片段。
● hl.fl:指定要高亮显示的字段列表。如果通配符是“*”,那么将高亮显示所有字段。
● hl.fragsize:每个片段返回的最大字符数。默认是 100;如果是 0,那么会使用整个字段的值而不分片。
● hl.simple.pre:设置出现在高亮显示的术语之前的文本(如<span>),默认是<em>。
● hl.simple.post:设置出现在高亮显示的术语之后的文本(如</span>),默认是</em>。
● hl.snippets:返回高亮摘要的段数,默认是1。
● hl.encoder:如果为空白,则是默认值,然后将返回存储的文本,而不会由高亮显示器执行任何转义/编码。如果设置为HTML,则将编码特殊的HTML/XML字符(如&变为&;)。
可以使用curl命令在命令行测试高亮。在Windows操作系统中,可以使用包管理器Chocolatey(https://chocolatey.org)安装curl命令行工具:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_20_3.jpg?sign=1739479503-83f1oXol8Nq61pKl94AkTwGCsPQn6cgR-0-7beaecee9ddd33b20d2d82041ca8a795)
测试高亮的命令行如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_20_4.jpg?sign=1739479503-WhxV2ETQ3RuSr4lg7PO8TmzDy7D4jv8h-0-f06b7af9d497c271589fb18b037b400b)
返回结果如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_20_5.jpg?sign=1739479503-1NnFMZXQkfhJ6fvKGhccDAdBvGXp0aO2-0-631a4037ca11a6f654c3cbc348db4a21)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_21_1.jpg?sign=1739479503-QeHI7AqGLgUf8rEr4f34bJQ5UstNHmUL-0-f1eec4c340f398039308f2259d9a25f5)
以下代码片段可以读取高亮显示的结果数据:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_21_2.jpg?sign=1739479503-AYnkjQuMYFDkxqnucxeLyardyNa4yVnM-0-d685ed451f5ecf2532c9f6f3151512d6)
用户在浏览器中所看到的搜索结果页可以由Web应用服务器动态生成。这里选择使用SpringBoot框架来开发动态网页服务应用程序。
在开发阶段,SpringBoot应用可以使用嵌入的Tomcat直接在Eclipse中运行。然后把应用打包成war文件,部署到独立的Tomcat服务器。
SpringBoot支持通过Java语言开发的模板引擎FreeMarker生成动态网页。FreeMarker模板引擎使用实体类提供的数据结合ftl模板文件生成动态页面。
修改build.gradle文件,增加项目对SpringBoot和FreeMarker的支持:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_21_3.jpg?sign=1739479503-ncxfbP68vn2C5x8J6tjz5A0FGafZB3oz-0-da00205ccfd1aa07b625e02da0524ffa)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_22_1.jpg?sign=1739479503-KHPu00uILWMWJXrUZyCaS7YWGXE2EB5X-0-b7f1f7a65462355ad5cc615eafa76527)
静态页面或JS、CSS、图片之类的静态资源可以放入resources目录下的static目录。把搜索首页index.html放入static目录。index.html将用户输入的查询词提交到/search路径下。index.html的内容如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_22_2.jpg?sign=1739479503-H2S1xNWWC5FCifNmIuJrRXEiiGrZOfvm-0-2f2a7c99a59e081d4ce6d551563f0143)
例如,用户输入“试验”,然后提交查询词,会跳转到 http://localhost:8080/search?query=%E8%AF%95%E9%AA%8C。
实体类WebItem将查询命中的文档封装成模板文件可以引用的形式:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_22_3.jpg?sign=1739479503-1UFfoZaVOMCU6Jlt9JWy7RPJ6pLsy7cv-0-29a3c9505266ab7e69c73d52dbdd200b)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_23_1.jpg?sign=1739479503-0utdQG1mh6nW44vjpIOm7oG8QlIqqosG-0-a872075c0c13f3d31af21133cb50c750)
CSS、图片之类的静态资源也置于 src\main\resources\static 目录下。default.css 位于src\main\resources\static\CSS目录下,可以通过/CSS/default.css引用这个CSS文件。
位于src\main\resources\templates\目录下的模板文件search.ftl的内容如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_23_2.jpg?sign=1739479503-PUaGo5QMZaxtE1pWT362d9zYb5eo2Lxf-0-ffe7eb9b9543be5786037176116e5b0e)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_24_1.jpg?sign=1739479503-UhdclgLNUkLQrkHK5wBhCYT9KHkH6Gkd-0-1ecdbe033395e42968b9a86287f2ddf0)
使用一个空的搜索结果页来测试项目:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_24_2.jpg?sign=1739479503-zfmsNlOqX6KP7OHepGMHbwfKqOrr5akz-0-d55ef2f79641e70b79db2ddf490911df)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_25_1.jpg?sign=1739479503-mdOu0GZXz29seNQUhSSbFPfLOgyYgBw7-0-5ac5c7bf2a7d3223935f3710a6c8f238)
将连接Solr服务的URL地址写入配置文件中。配置文件 src\main\resources\application.properties的内容如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_25_2.jpg?sign=1739479503-LAeifE4j3JzC84r0aCISKjP4rq5kvSZw-0-c96a69efa22d3609dd35f15006b36d8e)
增加和注入HttpSolrClient实例相关的方法如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_25_3.jpg?sign=1739479503-pkuHmcyvZiW7IrHJWn1UPsB9yluBuxre-0-d55ba5e8b40a8902ec82432c3615802a)
查询返回的结果可能很多,可以分页显示搜索结果。首先定义PagerTag,然后在模板中通过调用这个类的方法得到显示分页栏所需要的数据。
用于在模板中实现分页功能的分页标签类PagerTag的定义如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_25_4.jpg?sign=1739479503-rC4rPsw4J1jWqvbpKevzlJQhhNA1DyQm-0-41ad7c6214aca3b2da5f0f0d08fcf08f)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_26_1.jpg?sign=1739479503-5IyL8KHe9JmxZOA7fou421slxUy4QILO-0-371967e62f508ba36152fea7672ca40c)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_27_1.jpg?sign=1739479503-b2XW8nVddD1BIR6oBjcvcirMdYz5tQMe-0-18c56bd1d1781652be964f112149401f)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_28_1.jpg?sign=1739479503-Go6C0TBfXFNOFko0lBTJ2fFhyqsNbVOe-0-cf7e9b66f0b3ade79e42b2bd0b2ae3e3)
测试PagerTag:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_28_2.jpg?sign=1739479503-F3ZSSiHBU40Ky9fEIg4TAhFghY5ksJow-0-a3da86ac3bc32f6a77301ab528c1de6b)
为了显示分页栏,search.ftl 模板在表达式中引用了PagerTag类的 hasPrevPage()、hasNextPage()、getNextUrl()、getPrevUrl()等方法。search.ftl模板的实现如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_28_3.jpg?sign=1739479503-mFS8iGRmcwohw5LWnVd3RFI4RqIyOEUz-0-b015f6596efd01929808a1f30544fc08)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_29_1.jpg?sign=1739479503-Xsyc2s9527HaDOQkWaSLfMvrJzZV5R8H-0-24f2c08582d7c9b10a5da152eaee9ab3)
为了显示搜索结果,可以将SearchSolr类的fillModel()方法修改成如下形式:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_29_2.jpg?sign=1739479503-dMdZSV76VYDlM2IQYr9LRyOd7S1kYRMI-0-335fbd199fe73889bac7c51e52b3d4e5)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_30_1.jpg?sign=1739479503-WSpCIV3nJ7Nh9VXeMkEi2xXjVQ0FWl0h-0-37182d724a67aee24bff6796256ec0e5)
运行SearchSolr类。在浏览器中通过网址http://localhost:8080查看启动的服务。
这时,SprinBoot 使用嵌入的Tomcat提供Web服务。src\main\resources\application.properties文件中包含所有与配置相关的信息。例如,将端口号修改为80:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_30_2.jpg?sign=1739479503-DFcFvoL9Rixut5rYpqzBJRCyDEfphj2b-0-9746d518c63aede8a3adf468ea200d14)
为了正式部署,还需要下载Tomcat,可以从http://tomcat.apache.org下载得到,推荐使用Tomcat 8.5以上的版本。
然后设置环境变量。
如果是在 Linux操作系统中,可以用vi编辑器修改./bin/setclasspath.sh文件,增加行:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_31_1.jpg?sign=1739479503-DytWSA7egJ3OQLnUS1jpKfUgI58VE3zm-0-1353cc963548ea16586f1556372456ec)
如果是在Windows操作系统中,可以用文本编辑器“记事本”修改.\bin\setclasspath.bat文件,增加行:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_31_2.jpg?sign=1739479503-xeSOoAv9saUkKPWfPzGGyYtVrzIXgNIB-0-0582eee014a2b627885c1ecfb7a21757)
本节通过使用Solr快速实现了一个可以在互联网上发布的搜索引擎。