也许是时候构建一个专属的搜索引擎了

本贴最后更新于 2156 天前,其中的信息可能已经东海扬尘

百度、360、搜狗在搜索结果中都包含了许多自家产品的链接,导致了搜索体验并不是那么的好,就算没有那篇公众号文章,其实这个问题也一直存在,大部分人也都已经意识到了。所以过去很长一段时间,我都是使用必应搜索作为主要的搜索工具,谷歌、百度次之。谷歌不是主要的搜索工具是因为门槛问题。但是经常对于某个问题会需要在多个搜索引擎之间来回切换,这带来了诸多不便。因此想要把大三时期做的一个项目重新拾起,当时叫综合搜索引擎。

综合搜索引擎,其实是一个元搜索引擎。元搜索引擎又称多搜索引擎,通过一个统一的用户界面帮助用户在多个搜索引擎中选择和利用合适的(甚至是同时利用若干个)搜索引擎来实现检索操作,是对分布于网络的多种检索工具的全局控制机制。(来自百度百科)

项目目标

构建一个可以自由整合多个搜索引擎的搜索结果,并能进行去重、重排序等处理的源搜索引擎。

项目名称

hotoke

线上 Demo

所使用到的技术

.net core、java、lucene、python、redis

  • .net core 主要用于项目主体应用以及爬虫程序的实现。

  • java、lucene 主要用于构建自定义知识库,即使用爬虫程序爬取自己感兴趣的内容,再将记录通过 lucene 索引保存。

  • python、redis 主要用于构建 http ip 代理池,代理池的实现是使用 chenjiandongx/async-proxy-pool

项目介绍

快速启动

本项目的主体应用为 mainsite 目录下的 asp.net core 项目,启动后即可使用百度、必应、360 的综合搜索。

  1. 下载或克隆本项目:git clone https://github.com/venyowong/hotoke.git 或下载打包好的文件

  2. mainsite 项目依赖 .net core 运行环境,所以需要先安装 .net core

  3. 编辑 mainsite/appsettings.json 配置文件中的 Engines 属性,保留自己想使用的搜索引擎。

  4. 在 mainsite 目录下,启动终端,执行 dotnet run 命令;如果下载了已打包好的文件可以执行 dotnet MainSite.dll(这一步可能需要权限),你将会看到类似以下的输出:

Hosting environment:

Content root path:

Now listening on: http://0.0.0.0:80

Application started. Press Ctrl+C to shut down.
  1. 打开浏览器,访问 http://localhost 或 http://{your_ip}

加入自己感兴趣的内容

本项目除了提供整合多个搜索引擎结果的功能,还支持自定义搜索,即使用本项目实现的简易搜索引擎 hotoke-search,并使用爬虫,往 hotoke-search 里索引数据,最后在 mainsite 项目中加入 hotoke 搜索引擎。

hotoke-search 是基于 Lucene 编写的 Java 应用,因此运行之前需要安装配置 Java 环境。

本项目的 crawlers 目录下,提供了一个使用 .net core 实现的针对 Stackoverflow 的爬虫程序,程序使用到了 http ip 代理池,线上 Demo 部署时,是使用了 async-proxy-pool 这个开源项目。

以下介绍加入 Stackoverflow 到 hotoke-search 的步骤:

  1. 按照 async-proxy-pool 安装教程 安装好代理池,当然此步骤也可以省去,可以直接使用我已经搭建好的环境,此步骤只会影响到下面的第 7 步,若不想自己搭建代理池,保留 ProxyPoolUrl 配置即可

  2. 安装、配置 Java 环境

  3. 下载已打包好的 hotoke-search jar 包或自行使用 maven 打包 search 项目

  4. 打开命令行,执行 java -jar hotoke.search.jar,你将会看到类似以下的输出:

2019-01-05 10:46:46.732 [Thread-1] INFO org.eclipse.jetty.util.log - Logging initialized @1255ms to org.eclipse.jetty.util.log.Slf4jLog

2019-01-05 10:46:46.770 [Thread-1] INFO spark.embeddedserver.jetty.EmbeddedJettyServer - == Spark has ignited ...

2019-01-05 10:46:46.770 [Thread-1] INFO spark.embeddedserver.jetty.EmbeddedJettyServer - >> Listening on 0.0.0.0:4685

2019-01-05 10:46:46.773 [Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.4.8.v20171121, build timestamp: 2017-11-22T05:27:37+08:00, git hash: 82b8fb23f757335bb3329d540ce37a2a2615f0a8

2019-01-05 10:46:46.790 [Thread-1] INFO org.eclipse.jetty.server.session - DefaultSessionIdManager workerName=node0

2019-01-05 10:46:46.790 [Thread-1] INFO org.eclipse.jetty.server.session - No SessionScavenger set, using defaults

2019-01-05 10:46:46.792 [Thread-1] INFO org.eclipse.jetty.server.session - Scavenging every 600000ms

2019-01-05 10:46:46.812 [Thread-1] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@7bd447d3{HTTP/1.1,[http/1.1]}{0.0.0.0:4685}

2019-01-05 10:46:46.813 [Thread-1] INFO org.eclipse.jetty.server.Server - Started @1339ms
  1. 打开浏览器,访问 http://localhost:4685/health 或 http://{your_ip}:4685/health,你会看到"ok",则表示程序启动成功

  2. 添加一个 patu.yml 文件到 crawlers/patucrawler 目录下,内容类似以下示例:

Interval: 1y # 表示爬虫程序周期为一年

BloomSize: 30000000 # 布隆过滤器大小

ExpectedPageCount: 1500000 # 期望爬取到的页面数量

CrawlDeepth: 1 # 爬虫深度

Name: stackoverflow # 爬虫程序的名称

AutoDown: # 爬虫程序异常时自动终止的模块

EnableAutoDown: true # 启用

MaxTolerableRate: 30 # 每分钟最多能忍受程序报错次数

SmtpHost: # 爬虫程序终止后发送邮件的服务器,如果发送邮件的邮箱为 163,则是 smtp.163.com

SendMail: # 发送邮件的邮箱

SendPassword: # 发送邮件的邮箱的密码

ReceiveMail: # 接收邮件的邮箱
  1. 修改 crawlers/patucrawler/App.config 配置文件中的 IndexHost 属性,地址为 http://localhost:4685/index 或 http://{your_ip}:4685/index

  2. 修改 crawlers/patucrawler/log4net.config 配置文件中的日志文件存放路径

  3. 打开命令行,进入 crawlers/patucrawler 目录,执行 dotnet run 命令

  4. 通过 http://localhost:4685/count 或 http://{your_ip}:4685/count 可看到写入的文档数量

  5. 若发生异常或文档数量未增长,可查看爬虫程序日志或 hotoke-search 项目的日志,hotoke-search 项目日志在 hotoke.search.jar 文件所在目录的 log 子目录中

  6. 当爬虫程序和 hotoke-search 都运行正常,则可按照快速启动的步骤,在第 3 步加入 hotoke 即可在后续搜索中看到 hotoke 的搜索结果了

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • khitan

    感谢!!😄

  • Ahian

    权重和用户意图分析怎么解决

    1 回复
  • venyowong
    作者

    权重是直接配置的,用户意图没考虑过,这个太高端了。这个项目顶多算是一个搜索工具吧。