此存储库包含 https://searchmysite.net/ 的完整代码库、独立的开源搜索引擎以及针对个人和独立网站的搜索即服务(有关 searchmysite.net 的更多详细信息,请参阅关于 searchmysite.net)。
您可以使用此存储库来:
该应用程序分为 5 个组件,每个组件都部署在自己的 Docker 容器中:
项目目录结构如下:
.
├── data # Data for Docker data volumes (not in git - to be set up locally)
│ ├── solrdata # Mounted to /var/solr/solrdata in Solr Docker
│ ├── sqldata # Mounted to /var/lib/postgresql/data in Postgres Docker
├── src # Source files
│ ├── db # Database scripts
│ │ ├── bulkimport # Scripts to load sites into the database for the indexer to index
│ ├── indexing # Indexing code
│ │ ├── bulkimport # Scripts to load content directly into the search engine
│ │ ├── common # Indexing code shared between bulk import and spider
│ │ ├── indexer # Spidering code
│ ├── models # Language models
│ ├── search # Search engine configuration
│ ├── web # Files for deployment to web / app server
│ │ ├── config # Web server configuration
│ │ ├── content/dynamic # Dynamic pages and API, for deployment to app server
│ │ ├── content/static # Static assets, for deployment to static web server
├── tests # Test scripts
└── README.md # This file
有 3 个 docker-compose 文件,它们基本上相同,除了:
确保 Docker 已安装。
获取源代码,例如
cd ~/projects/
git clone https://github.com/searchmysite/searchmysite.net.git
为数据库和搜索索引创建数据目录:
cd ~/projects/searchmysite.net/
mkdir -p data/solrdata
mkdir -p data/sqldata
sudo chown 8983:8983 data/solrdata
为 docker-compose.yml 创建一个 ~/projects/searchmysite.net/src/.env 文件,至少包含以下内容:
POSTGRES_PASSWORD=<password>
SECRET_KEY=<secretkey>
POSTGRES_PASSWORD 和 SECRET_KEY 可以是您为本地开发选择的任何值。请注意,虽然这些是基本应用程序工作所需的唯一值,但还需要设置其他值才能实现附加功能 - 请参阅下面的“其他环境变量”部分。
最后,构建 docker 镜像:
cd ~/projects/searchmysite.net/src
docker compose build
请注意,第一次构建可能需要 20-30 分钟,并且模型容器会下载 3Gb 的模型文件。
满足先决条件后,您可以通过以下方式启动您的开发环境:
cd ~/projects/searchmysite.net/src
docker compose up -d
该网站位于 http://localhost:8080/,Apache Solr 管理界面位于 http://localhost:8983/solr/#/。
如果您希望能够批准或拒绝添加为基本列表的网站,您将需要设置一个或多个管理员用户。只有经过验证的网站所有者(即具有完整列表并能够登录的网站所有者)才能被授予管理员用户权限。您可以使用 Web 界面通过添加站点将您自己的站点添加为完整列表,或将详细信息直接插入数据库。
一旦您拥有一位或多位经过验证的网站所有者,您就可以授予他们作为数据库中的管理员的权限,例如:
INSERT INTO tblPermissions (domain, role)
VALUES ('michael-lewis.com', 'admin');
您可以使用添加站点通过 Web 界面添加一个或多个站点作为基本列表。您需要以管理员用户身份登录,单击“审核”,然后选择“批准”以便将它们排队等待建立索引。
src/db/bulkimport 中也有批量导入脚本。 checkdomains.py 将域或主页列表作为输入,检查它们是否是有效站点,以及它们是否不在列表或数据库中,并生成一个文件供 insertdomains.py 插入。
另请参见#91 中的讨论。
如果您想使用发送电子邮件的功能(例如联系表单),您将需要设置以下值:
SMTP_SERVER=
SMTP_PORT=
SMTP_FROM_EMAIL=
SMTP_FROM_PASSWORD=
SMTP_TO_EMAIL=
如果只是测试,您可以创建一个基于 Web 的电子邮件帐户并使用 SMTP 详细信息。
如果您想启用已验证提交的付款机制,您将需要设置:
ENABLE_PAYMENT=True
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
STRIPE_PRODUCT_ID=
STRIPE_ENDPOINT_SECRET=
如果只是测试,您可以从 Stripe 获得一个测试帐户。
dev 的 docker-compose.yml 将 Web 服务器配置为从源读取,因此可以在源中进行更改并重新加载。通常需要重新启动 Web 服务器才能查看更改:
docker exec -it web_dev apachectl restart
对于频繁的更改,最好使用 Docker 之外的 Flask 开发环境。
为此,首先,您需要为“db”、“models”和“search”设置本地主机条目,即在 /etc/hosts 中(假定“web”容器与 db、models 和 search 容器通信)通过“db”、“models”和“search”主机名):
127.0.0.1 search
127.0.0.1 db
127.0.0.1 models
其次,在本地安装 Flask 和依赖项(注意 mod-wsgi 需要 apache2-dev,psycopg2 需要 libpq-dev),并以可编辑模式安装 searchmysite 包(这些步骤只需执行一次):
sudo apt install apache2-dev libpq-dev
cd ~/projects/searchmysite.net/src/web/
pip3 install -r requirements.txt
cd ~/projects/searchmysite.net/src/web/content/dynamic/
pip3 install -e .
最后,在每个开发会话开始时,加载环境变量并通过以下方式在开发模式下启动 Flask:
set -a; source ~/projects/searchmysite.net/src/.env; set +a
export FLASK_ENV=development
export FLASK_APP=~/projects/searchmysite.net/src/web/content/dynamic/searchmysite
flask run --debug
您的本地 Flask 网站将位于 http://localhost:5000/search/(请注意,主页,即 http://localhost:5000/,不是动态提供的,因此无法通过 Flask 访问) 。对代码的更改将在不重新启动服务器的情况下得到反映,您将看到调试日志消息,并且在出现错误时完整的堆栈跟踪将更加明显。
与 Web 容器一样,dev 上的索引容器配置为直接从源读取,因此只需保存更改即可。
您通常会通过运行如下 SQL 来触发重新索引:
UPDATE tblDomains
SET full_indexing_status = 'PENDING'
WHERE domain = 'michael-lewis.com';
并等待下一个 src/indexing/indexer/run.sh (开发时最多 1 分钟),或手动触发它:
docker exec -it src-indexing-1 python /usr/src/app/search_my_site_scheduler.py
如果您手动触发它并且计划的作业然后运行,那么同时运行多个调度程序应该不会有任何问题。
您可以通过以下方式监控索引日志:
docker logs -f src-indexing-1
并可以在 src/indexing/indexer/settings.py 中将 LOG_LEVEL 更改为 DEBUG。
dev Solr docker 容器在构建时复制配置,因此每次配置更改都需要docker compose build
。
请注意, solr-precreate content /opt/solr/server/solr/configsets/content
在docker compose build
之后实际上不会加载新配置,因此需要执行以下步骤来应用 Solr 配置更改:
docker compose build
docker compose up -d
docker exec -it search_dev cp -r /opt/solr/server/solr/configsets/content/conf /var/solr/data/content/
docker restart search_dev
根据变化,您可能还需要删除索引中的部分或全部数据,例如
curl http://localhost:8983/solr/content/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>domain:michael-lewis.com</query></delete>'
并按照上面的方式触发重新索引。使用<query>*:*</query>
删除索引中的所有数据。
您还可以删除并重新创建 data/solrdata 目录,然后重建,以重新开始。
您可以通过以下方式连接到数据库:
"host": "127.0.0.1",
"user": "postgres",
"port": 5432,
"ssl": false,
"database": "searchmysitedb",
"password": <password-from-dotenv-file>
架构更改应应用于 src/db/sql/init* 文件,因此,如果删除并重新创建 data/sqldata 目录,则会应用最新架构。
对于相关性调整的基本实验,您可以手动添加一些站点,然后对这些站点进行实验。请记住确保这些站点之间存在链接,因为indexed_inlink_domains_count是评分的重要因素。另请记住,indexed_inlink* 值可能需要对站点建立索引两次才能正确设置 - 索引过程根据 indexed_outlink* 值设置 indexed_inlink* 值,因此需要第一遍来确保所有站点都设置了 indexed_outlink* 值。
然而,对于严重的相关性调整,最好使用生产 Solr 集合的恢复。如果您有兴趣这样做,请告诉我,我将提供最新的版本。
请注意,如果您向 Solr 架构添加要在相关性评分中使用的新字段,最好等到所有站点都添加了这些字段后再部署新的相关性评分更改。有两种方法可以执行此操作:强制对所有站点重新建立索引,或者等待所有站点自然地重新建立索引。等待自然重新索引更容易、更安全。由于重新索引以 20 个为批次进行,并且某些网站需要 1 小时以上才能重新建立索引,因此强制重新建立索引的所有内容可能需要 24 小时以上,而自然重新索引将需要 3.5 天才能确保所有经过验证的网站都重新建立索引(对于 20 个网站而言,需要 28 天)。未经验证的网站)。
测试是在本地 Flask 实例上使用 pytest 运行的,因此您需要安装 pytest 并按照上面的“在本地开发上进行更改”/“Web 更改”部分设置本地 Flask 实例。如果您设置了 ENABLE_PAYMENT=True,则还需要设置 Selenium 和 WebDriver,因为 Stripe 集成涉及执行 JavaScript 的按钮,例如:
pip3 install selenium
pip3 install chromedriver-py
有两个测试脚本:
clean_test_env.sh
- 关闭所有开发 docker 实例,重建并启动干净的测试 docker 实例。run_tests.sh
- 设置环境变量,运行 pytest 脚本和索引。pytest脚本:
运行:
cd ~/projects/searchmysite.net/tests
./clean_test_env.sh
./run_tests.sh
索引步骤将需要一两分钟,因为它正在对真实站点执行索引,并且如果 ENABLE_PAYMENT=True 您将看到弹出一个浏览器,需要几秒钟才能打开和关闭。
如果测试成功,它将使环境保持与开始时相同的状态,即它会自行清理,因此您不需要在run_tests.sh
之前再次运行clean_test_env.sh
。但是,如果测试失败,您将需要重新运行clean_test_env.sh
。出于同样的原因,如果您不小心对开发环境而不是测试环境运行了run_tests.sh
,例如因为您没有首先运行clean_test_env.sh
,那么如果测试成功,那么环境就会很好。不过,最好使用测试 docker 环境,因为这提供了一个已知的干净起点,并确保计划的重新索引不会干扰测试中的索引。