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

 

posted on 2019-06-13 10:45  卓达  阅读(1131)  评论(0编辑  收藏  举报

导航