elasticsearch 索引的使用(配合haystack)

1,# 從倉庫拉取鏡像
$ sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
2,下載elasticsearc-2.4.6目錄拷貝到home目錄下。
修改/home/python/elasticsearc-2.4.6/config/elasticsearch.yml第54行。
更改 ip 地址爲本機真實 ip 地址。
3,使用docker運行Elasticsearch
sudo docker run -dti --name=elasticsearch --network=host -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
4,
$ pip install django-haystack
$ pip install elasticsearch==2.4.1

5.Haystack 註冊應用和路由 (settings配置文件中)
INSTALLED_APPS = [
# 全文檢索
'haystack',
]
# Haystack 註冊
url(r'^search/', include('haystack.urls')),

6,在配置文件中配置 Haystack 爲搜索引擎後端
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://172.16.238.128:9200/', # Elasticsearch服務器ip地址,端口號固定爲9200
'INDEX_NAME': 'meiduo_mall', # Elasticsearch創建的索引庫的名稱
},
}
# 當添加、修改、刪除數據時,自動生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor

7,Haystack 創建數據索引
1.建立索引類

經過建立索引類,來指明讓搜索引擎對哪些字段創建索引,也就是能夠經過哪些字段的關鍵字來檢索數據。
本項目中對 SKU 信息進行全文檢索,因此在 goods 應用中新建 search_indexes.py 文件,用於存放索引類。python

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 創建的字段,均可以藉助 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 }}
模板文件說明:當將關鍵詞經過text參數名傳遞時
此模板指明 SKU 的id、name、caption做爲text字段的索引值來進行關鍵字索引查詢。

8,手動生成索引
python manage.py rebuild_index

9,測試索引
.準備測試表單
請求方法:GET
請求地址:/search/
請求參數:q
在 goods.views.py 文件中添加以下代碼:docker

class MySearchView(SearchView):
    '''重寫SearchView類'''
    def create_response(self):
        page = self.request.GET.get('page')
        # 獲取搜索結果
        context = self.get_context()
        data_list = []
        for sku in context['page'].object_list:
            data_list.append({
                'id':sku.object.id,
                'name':sku.object.name,
                'price':sku.object.price,
                'default_image_url':sku.object.default_image_url,
                'searchkey':context.get('query'),
                'page_size':context['page'].paginator.num_pages,
                'count':context['page'].paginator.count
            })
        # 拼接參數, 返回
        return http.JsonResponse(data_list, safe=False)


路由配置,沒有as_view()
url(r'^search/$', views.MySearchView()),

# 能夠在 dev.py 中添加以下代碼, 用於決定每頁顯示數據條數:
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
數據庫

相關文章
相關標籤/搜索