django 搜索引擎 Elasticsearch 安裝使用


1.使用docker安裝elasticsearch

a.獲取鏡像

#  拉取鏡像到本地倉庫
#  docker image pull delron/elasticsearch-ik:2.4.6-1.0
由於pull拉取會比較慢, 可以將百度網盤中的elasticsearch-ik-2.4.6_docker.tar文件傳到虛擬機中
然后導入鏡像: 
docker load -i elasticsearch-ik-2.4.6_docker.tar


# 查看本地倉庫是否有這個鏡像
docker images
或docker image ls

b.將百度雲盤中的elasticsearch.zip文件傳到虛擬機中的家目錄,然后unzip解壓。在虛擬機中的elasticsearch/config/elasticsearch.yml第54行,更改ip地址為0.0.0.0,端口改為8002,默認端口為9200.

# 在xshell中使用rz命令將elasticsearch.zip文件傳到虛擬機的家目錄中
#然后在家目錄中解壓
unzip elasticsearch.zip
cd ~/elasticsearch/config


# network.host: 172.18.168.123
network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
http.port: 8002

c.創建docker容器並運行

# 根據拉取到本地的鏡像創建容器,需要將/home/bd/elasticsearch/config配置文件所在目錄修改為你自己的路徑
docker run -dti --network=host --name=elasticsearch -v /home/pyvip/elasticsearch/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0

# 查看是否創建成功
docker container ls -a 
# 如果STATUS為Up則創建容器成功
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS               NAMES
b254fe1ee0eb        delron/elasticsearch-ik:2.4.6-1.0   "/docker-entrypoint.…"   3 days ago          Up 3 days                               elasticsearch

# 運行如下命令,如果有顯示則elasticsearch配置成功
curl 127.0.0.1:8002

d.進入項目虛擬環境中,安裝相關包

# 進入項目虛擬環境
workon myblog_env

pip install django-haystack
pip install elasticsearch==2.4.1

e.在settings.py文件中加入如下配置:

INSTALLED_APPS = [
    'haystack',
]

ELASTICSEARCH_DSL = {
    'default': {
        'hosts': '127.0.0.1:8002'
    },
}

# Haystack
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:8002/',  # 此處為elasticsearch運行的服務器ip地址,端口號默認為9200
        'INDEX_NAME': 'dj_pre_class',  # 指定elasticsearch建立的索引庫的名稱
    },
}

# 設置每頁顯示的數據量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
# 當數據庫改變時,會自動更新索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

2.后端功能實現(初始化索引)

# 在apps/news/search_indexes.py中創建如下類:(名稱固定為search_indexes.py)


from haystack import indexes
# from haystack import site

from .models import News


class NewsIndex(indexes.SearchIndex, indexes.Indexable):
    """
    News索引數據模型類
    """
    text = indexes.CharField(document=True, use_template=True)
    id = indexes.IntegerField(model_attr='id')
    title = indexes.CharField(model_attr='title')
    digest = indexes.CharField(model_attr='digest')
    content = indexes.CharField(model_attr='content')
    image_url = indexes.CharField(model_attr='image_url')
    # comments = indexes.IntegerField(model_attr='comments')

    def get_model(self):
        """返回建立索引的模型類
        """
        return News

    def index_queryset(self, using=None):
        """返回要建立索引的數據查詢集
        """

        return self.get_model().objects.filter(is_delete=False, tag_id=1)
from haystack.views import SearchView as _SearchView


class SearchView(_SearchView):
    # 模版文件
    template = 'news/search.html'

    # 重寫響應方式,如果請求參數q為空,返回模型News的熱門新聞數據,否則根據參數q搜索相關數據
    def create_response(self):
        kw = self.request.GET.get('q', '')
        if not kw:
            show_all = True
            hot_news = models.HotNews.objects.select_related('news'). \
                only('news__title', 'news__image_url', 'news__id'). \
                filter(is_delete=False).order_by('priority', '-news__clicks')

            paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE)
            try:
                page = paginator.page(int(self.request.GET.get('page', 1)))
            except PageNotAnInteger:
                # 如果參數page的數據類型不是整型,則返回第一頁數據
                page = paginator.page(1)
            except EmptyPage:
                # 用戶訪問的頁數大於實際頁數,則返回最后一頁的數據
                page = paginator.page(paginator.num_pages)
            return render(self.request, self.template, locals())
        else:
            show_all = False
            qs = super(SearchView, self).create_response()
            return qs



# 創建templates/search/indexes/news/news_text.txt文件(文件名為:應用名_text.txt)

{{ object.title }}
{{ object.digest }}
{{ object.content }}

 

# 在虛擬機中執行如下命令,生成索引

python manage.py rebuild_index

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM