更詳細請看 https://www.elastic.co/cn/python
1. 全文檢索和搜索引擎原理docker
商品搜索需求數據庫
當用戶在搜索框輸入商品關鍵字後,咱們要爲用戶提供相關的商品搜索結果。apache
商品搜索實現django
能夠選擇使用模糊查詢like關鍵字實現。
可是 like 關鍵字的效率極低。
查詢須要在多個字段中進行,使用 like 關鍵字也不方便。後端
全文檢索方案服務器
咱們引入全文檢索的方案來實現商品搜索。
全文檢索即在指定的任意字段中進行檢索查詢。
全文檢索方案須要配合搜索引擎來實現。框架
搜索引擎原理elasticsearch
搜索引擎進行全文檢索時,會對數據庫中的數據進行一遍預處理,單獨創建起一份索引結構數據。
索引結構數據相似新華字典的索引檢索頁,裏面包含了關鍵詞與詞條的對應關係,並記錄詞條的位置。
搜索引擎進行全文檢索時,將關鍵字在索引數據中進行快速對比查找,進而找到數據的真實存儲位置。測試
結論:
實現全文檢索的搜索引擎,首選的是
Elasticsearch
。
分詞說明
我是中國人
Elasticsearch 不支持對中文進行分詞創建索引,須要配合擴展elasticsearch-analysis-ik
來實現中文分詞處理。
我
、是
、中
、國
、人
、中國
等等均可以是這句話的關鍵字。1.獲取Elasticsearch-ik鏡像
# 從倉庫拉取鏡像 $ sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
2.配置Elasticsearch-ik
/home/python/elasticsearc-2.4.6/config/elasticsearch.yml
第54行。
3.使用Docker運行Elasticsearch-ik
$ sudo docker run -dti --name=elasticsearch --network=host -v /home/python/elasticsearch-2.4.6/config:/usr/share/elast
提示:
- Elasticsearch的底層是開源庫Lucene。可是無法直接使用 Lucene,必須本身寫代碼去調用它的接口。
思考:
- 咱們如何對接 Elasticsearch服務端?
解決方案:
- Haystack
1.Haystack介紹
Elasticsearch
、Whoosh
、Solr
等等)。
2.Haystack安裝
$ pip install django-haystack $ pip install elasticsearch==2.4.1
3.Haystack註冊應用和路由
INSTALLED_APPS = [ 'haystack', # 全文檢索 ] url(r'^search/', include('haystack.urls')),
4.Haystack配置
- 在配置文件中配置Haystack爲搜索引擎後端
# Haystack HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://192.168.103.158:9200/', # Elasticsearch服務器ip地址,端口號固定爲9200 'INDEX_NAME': 'meiduo_mall', # Elasticsearch創建的索引庫的名稱 }, } # 當添加、修改、刪除數據時,自動生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
重要提示:
- HAYSTACK_SIGNAL_PROCESSOR配置項保證了在Django運行起來後,有新的數據產生時,Haystack仍然可讓Elasticsearch實時生成新數據的索引
1.建立索引類
goods
應用中新建search_indexes.py
文件,用於存放索引類。from haystack import indexes from .models import SKU class SKUIndex(indexes.SearchIndex, indexes.Indexable): """SKU索引數據模型類""" text = indexes.CharField(document=True, use_template=True) def get_model(self): """返回創建索引的模型類""" return SKU def index_queryset(self, using=None): """返回要創建索引的數據查詢集""" return self.get_model().objects.filter(is_launched=True)
SKUIndex
創建的字段,均可以藉助Haystack
由Elasticsearch
搜索引擎查詢。text
字段咱們聲明爲document=True
,表名該字段是主要進行關鍵字查詢的字段。text
字段的索引值能夠由多個數據庫模型類字段組成,具體由哪些模型類字段組成,咱們用use_template=True
表示後續經過模板來指明。2.建立
text
字段索引值模板文件
templates
目錄中建立text字段
使用的模板文件templates/search/indexes/goods/sku_text.txt
文件中定義{{ object.id }} {{ object.name }} {{ object.caption }}
id
、name
、caption
做爲text
字段的索引值來進行關鍵字索引查詢。3.手動生成初始索引
$ python manage.py rebuild_index
1.準備測試表單
GET
/search/
q
<div class="search_wrap fl"> <form method="get" action="/search/" class="search_con"> <input type="text" class="input_text fl" name="q" placeholder="搜索商品"> <input type="submit" class="input_btn fr" name="" value="搜索"> </form> <ul class="search_suggest fl"> <li><a href="#">索尼微單</a></li> <li><a href="#">優惠15元</a></li> <li><a href="#">美妝個護</a></li> <li><a href="#">買2免1</a></li> </ul> </div>