Java 全文搜索引擎服务器
用户指南
设置
-
下载本项目
-
运行
$ cd FTServer
$ mvn package cargo:run
-
按 [Ctrl-C] 停止容器
输入完整 URL 来索引页面,然后搜索。
通过重新索引页面来移动页面。
搜索格式
[单词1 单词2 单词3] => 文本包含单词1和单词2和单词3
["单词1 单词2 单词3"] => 文本包含**"单词1 单词2 单词3"**作为整体
搜索 [https] 或 [http] => 获取几乎所有页面
开发者指南
依赖
结果排序
结果排序基于 PageText 类中的 id() 数字,降序排列。
一个页面有多个 PageTexts。如果不需要多个文本,修改 Html.getDefaultTexts(Page),只返回一个 PageText(仅页面描述文本,Config.DescriptionOnly=true)。
Page.GetRandomContent() 方法用于保持搜索页面内容始终变化,不影响实际 PageText 顺序。
使用 ID 号控制顺序,而不是将所有页面加载到内存中。
搜索方法
search (... String keywords, long startId, long count)
startId => 从哪个 ID(创建 PageText 时的 id)开始,使用 (startId=Long.MaxValue) 从顶部开始读取,降序排列
count => 要读取的记录数,重要参数,搜索速度取决于此参数,而不是数据量大小。
下一页
将 startId 设置为搜索结果中最后一个 id 减一
startId = search( "keywords", startId, count);
nextpage_startId = startId - 1 // 这个"减一"已在 search() 内部完成
...
//读取下一页
search("keywords", nextpage_startId, count)
通常,nextpage_startId 在用户到达网页底部时从客户端浏览器发送, 并将默认 nextpage_startId 设置为 Long.MaxValue, 在 JavaScript 中大数字必须写成字符串 ("'" + nextpage_startId + "'")
私有服务器
打开
public Page Html.get(String url);
设置您的私有网站文本
Page page = new Page();
page.url = url;
page.title = title;
page.text = replace(doc.body().text());
page... = ...
return page;
配置缓存
从 FTServer/.mvn/jvm.config 设置 JVM 内存,默认为 4GB。
从 FTServer/src/main/java/ftserver/Config.java 设置索引只读缓存 (Readonly_MaxDBCount)。
停止 Tracker 守护进程
[user@localhost ~]$ tracker daemon -k
[user@localhost ~]$ rm -rf .cache/tracker/
设置更大的最大打开文件数
[user@localhost ~]$ cat /proc/sys/fs/file-max
803882
[user@localhost ~]$ ulimit -a | grep files
open files (-n) 500000
[user@localhost ~]$ ulimit -Hn
500000
[user@localhost ~]$ ulimit -Sn
500000
[user@localhost ~]$
$ vi /etc/security/limits.conf
* hard nofile 500000
* soft nofile 500000
root hard nofile 500000
root soft nofile 500000
降低文件预读(RA)
[user@localhost ~]$ sudo blockdev --report
//如果预读(RA)大于硬件速度,可以设置得更低。
//这取决于硬件参数。
[user@localhost ~]$ sudo blockdev --setra 128 /dev/sda
[user@localhost ~]$ sudo blockdev --setra 128 /dev/dm-0
[user@localhost ~]$ sudo blockdev --setra 128 /dev/dm-1
[user@localhost ~]$ lsblk -o NAME,RA
[user@localhost ~]$ free -m
[user@localhost ~]$ sudo sysctl vm.drop_caches=3
为远程访问添加防火墙端口
[user@localhost ~]$ firewall-cmd --add-port=8088/tcp --permanent
设置 Java 版本
//Java 11 版本
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
//Java 18 版本
export JAVA_HOME=/home/user/Downloads/jdk-18.0.1.1
//Java 21 版本
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-21.0.2.0.13-1.el9.x86_64
$ alternatives --config java