此儲存庫包含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 天才能確保所有已驗證的網站都重新建立索引(對於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 環境,因為這提供了一個已知的乾淨起點,並確保計劃的重新索引不會幹擾測試中的索引。