示例應用程序旨在說明如何使用自然語言處理(NLP) (NLP)如何用於提高Elasticsearch查詢和整體用戶體驗的準確性。與Elasticsearch一起使用NLP(或任何其他全文搜索引擎)有兩個關鍵的好處:
考慮到“黑色外套的價格低於$ 200” ,我們可以推斷出顏色和最大價格,並將這些搜索過濾器應用於用戶。這個概念可以擴展到其他領域(例如品牌),也可以支持共軛,例如“黑色或深綠色的Barbour夾克”
想像一下,您在室外服裝和設備商店工作。您正在構建目錄搜索功能。鑑於查詢“包裝外套”,數據庫應如何在“包裝蚊帳”和“輕量級夾克”之間進行選擇。兩種產品部分匹配。 TF- IDF很可能會選擇蚊帳,因為與語料庫中的“夾克”的實例要少。但是,在查看查詢時,很明顯,輕巧的外套將是更好的匹配。
通常,我們通過增加某些文檔字段來解決此問題,例如,將重量增加到標題或產品類型字段而不是描述。這種作品,但邏輯是錯誤的。我們本質上告訴購物者“根據我們的出售,這對您來說很重要”。
人類知道,鑑於“可包裝夾克”的查詢,購物者首先想要一件外套。那是因為我們了解“夾克”是產品類型,而“包裝”是產品的屬性。自然語言處理(NLP)允許我們以編程方式應用相同的推理。簡而言之,我們可以執行Elasticsearch bool查詢,其中必須與“夾克”匹配,並且應該與“包裝”匹配。
首先,最重要的是,這不是生產實施。用於此示例的NLP模型確實是基本的。為了生產使用,我們會構建一些更強大的東西,並通過歷史搜索數據進行培訓。我們還將採用一部分語音標記以及依賴性解析,以更好地了解文本的句子和片段。
其次,Elasticsearch代碼非常基本。為了生產使用,我們想使用自定義令牌,分析儀和同義詞。當然,我們還有更多的字段和更多的文檔。
最後,沒有錯誤處理!
因此,請以創造的精神對待這一點 -概念證明!
Python代碼需要一個3.9.7+的環境。我建議使用VENV或pyenv/virtualenv在Virtualenv中運行此操作
$ pyenv install 3.9.7
$ pyenv virtualenv 3.9.7 nlp-search-poc
$ pyenv local nlp-search-poc
$ pip install -U pip
$ pip install -r requirements.txt我已經提供了一個Docker-compose.yml文件,因此您可以啟動簡單的Elasticsearch實例
$ docker-compose up -d elasticsearch-7python的依賴性和路徑可能很棘手,因此我提供了一個簡單的實用程序來檢查所有內容,如預期。注意: Elasticsearch可能需要幾秒鐘才能在線。
$ python -m src.tools ping
Elasticsearch alive: True$ python -m src.tools create
productRepository INFO Creating products index
productRepository INFO products created
$ python -m src.tools ingest
productRepository INFO Ingesting lightweight black jacket
productRepository INFO Ingesting midweight black jacket
...我創建了一個包裝器殼腳本來啟動Uvicorn/fastapi
$ bin/server.sh
uvicorn.error INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
...向http:// localhost提出請求:8000通過JSON主體:
{
"query" : " lightweight black jacket less than $100 "
}Postman可能是最好的工具,但我還提供了一個簡單的客戶:
$ python -m src.client ' lightweight black jacket less than $100 ' {
"ner_prediction" : {
"text" : " lightweight black jacket less than $100 " ,
"product" : " jacket " ,
"price_from" : null ,
"price_to" : 100 ,
"colors" : [
" black "
],
"attrs" : [
" lightweight "
]
},
"results" : [
{
"title" : " lightweight black jacket " ,
"product_type" : " jacket " ,
"price" : 100 ,
"colors" : [
" black "
],
"attrs" : [
" lightweight "
]
}
]
}重要的是:如果您選擇使用此腳本,則應將搜索查詢包裝在單個引號中,以避免可變擴展。
點擊Ctrl + C
不用擔心asyncio.exceptions.CancelledError這是由uvicorn服務器的熱重加載功能引起的。
$ python -m src.tools drop
productRepository INFO Dropping products index
productRepository INFO products dropped$ docker-compose down
Stopping elasticsearch-7 ... done
Removing elasticsearch-7 ... done
Removing network nlp-search-poc_default我提供了一個Dockerfile,以防您想在Docker內運行所有內容
$ docker build -t nlp-search-poc .然後運行Elasticsearch和服務器
$ docker-compose up -d如果您還想使用Docker將測試數據攝入Elasticsearch,則可以這樣做:
$ docker run -it --rm --network nlp-search-poc_default -e " ELASTIC_SEARCH_HOST=elasticsearch-7 " nlp-search-poc " python " " -m " " src.tools " " reset "注意:網絡名稱由Docker的網絡規則確定
docker-compose.yml公開了服務器的端口8000,因此您可以像以前一樣查詢:
$ python -m src.client ' packable jacket '