全文檢索方案Elasticsearch【Python-Django 服務端開發】

更詳細請看 https://www.elastic.co/cn/python

 

1. 全文檢索和搜索引擎原理docker


商品搜索需求數據庫

當用戶在搜索框輸入商品關鍵字後,咱們要爲用戶提供相關的商品搜索結果。apache


商品搜索實現django

能夠選擇使用模糊查詢like關鍵字實現。
可是 like 關鍵字的效率極低。
查詢須要在多個字段中進行,使用 like 關鍵字也不方便。後端


全文檢索方案服務器

咱們引入全文檢索的方案來實現商品搜索。
全文檢索即在指定的任意字段中進行檢索查詢。
全文檢索方案須要配合搜索引擎來實現。框架


搜索引擎原理elasticsearch

搜索引擎進行全文檢索時,會對數據庫中的數據進行一遍預處理,單獨創建起一份索引結構數據。
索引結構數據相似新華字典的索引檢索頁,裏面包含了關鍵詞與詞條的對應關係,並記錄詞條的位置。
搜索引擎進行全文檢索時,將關鍵字在索引數據中進行快速對比查找,進而找到數據的真實存儲位置。測試

結論:

  • 搜索引擎創建索引結構數據,相似新華字典的索引檢索頁,全文檢索時,關鍵字在索引數據中進行快速對比查找,進而找到數據的真實存儲位置。

 

2. Elasticsearch介紹

實現全文檢索的搜索引擎,首選的是Elasticsearch

  • Elasticsearch是用 Java 實現的,開源的搜索引擎。
  • 它能夠快速地儲存、搜索和分析海量數據。維基百科、Stack Overflow、Github等都採用它。
  • Elasticsearch 的底層是開源庫Lucene 。可是,無法直接使用 Lucene,必須本身寫代碼去調用它的接口。

分詞說明

  • 搜索引擎在對數據構建索引時,須要進行分詞處理。
  • 分詞是指將一句話拆解成多個單字或詞,這些字或詞即是這句話的關鍵詞。
  • 好比:我是中國人Elasticsearch 不支持對中文進行分詞創建索引,須要配合擴展elasticsearch-analysis-ik來實現中文分詞處理。
    • 分詞後:中國等等均可以是這句話的關鍵字。

3. 使用Docker安裝Elasticsearch

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行。
  • 更改ip地址爲本機真實ip地址。

 

 

3.使用Docker運行Elasticsearch-ik

$ sudo docker run -dti --name=elasticsearch --network=host -v /home/python/elasticsearch-2.4.6/config:/usr/share/elast

 

Haystack擴展創建索引

提示:

  • Elasticsearch的底層是開源庫Lucene。可是無法直接使用 Lucene,必須本身寫代碼去調用它的接口。

思考:

  • 咱們如何對接 Elasticsearch服務端?

解決方案:

  • Haystack

1. Haystack介紹和安裝配置

1.Haystack介紹

  • Haystack 是在Django中對接搜索引擎的框架,搭建了用戶和搜索引擎之間的溝通橋樑。Haystack 能夠在不修改代碼的狀況下使用不一樣的搜索後端(好比ElasticsearchWhooshSolr等等)。
    • 咱們在Django中能夠經過使用 Haystack 來調用 Elasticsearch 搜索引擎。

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實時生成新數據的索引

 

2. Haystack創建數據索引

1.建立索引類

  • 經過建立索引類,來指明讓搜索引擎對哪些字段創建索引,也就是能夠經過哪些字段的關鍵字來檢索數據。
  • 本項目中對SKU信息進行全文檢索,因此在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說明:
    • SKUIndex創建的字段,均可以藉助HaystackElasticsearch搜索引擎查詢。
    • 其中text字段咱們聲明爲document=True,表名該字段是主要進行關鍵字查詢的字段。
    • text字段的索引值能夠由多個數據庫模型類字段組成,具體由哪些模型類字段組成,咱們用use_template=True表示後續經過模板來指明。

2.建立text字段索引值模板文件

  • templates目錄中建立text字段使用的模板文件
  • 具體在templates/search/indexes/goods/sku_text.txt文件中定義
{{ object.id }}
{{ object.name }}
{{ object.caption }}

  

  • 模板文件說明:當將關鍵詞經過text參數名傳遞時
    • 此模板指明SKU的idnamecaption做爲text字段的索引值來進行關鍵字索引查詢。

3.手動生成初始索引

$ python manage.py rebuild_index

  

 

3. 全文檢索測試

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>
相關文章
相關標籤/搜索