python-django框架中使用docker和elasticsearch配合实现搜索功能

注意:系统环境为Ubuntu18

一、docker安装

0:如果之前有安装过docker使用以下命令卸载:

bash;gutter:true; sudo apt-get remove docker docker-engine docker.io containerd runc</p> <pre><code> docker安装官网参考: [https://docs.docker.com/install/linux/docker-ce/ubuntu/](https://docs.docker.com/install/linux/docker-ce/ubuntu/) 1:首先更新apt ;gutter:true;
sudo apt-get update

2:添加证书安装包以允许apt通过HTTPS:

bash;gutter:true; sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common</p> <pre><code> 3:添加docker官方密钥 ;gutter:true;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

4:添加仓库

bash;gutter:true; sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"</p> <pre><code> 5:安装docker ce ;gutter:true;
sudo apt-get install docker-ce docker-ce-cli containerd.io

6:测试

bash;gutter:true; sudo docker run hello-world</p> <pre><code> 7:添加当前系统用户到docker用户组 ;gutter:true;
sudo usermod -aG docker 用户名

docker 拓展命令:

docker images :查看所有启动成功的镜像

docker ps -a :查看所有

docker logs 容器id :查看容器日志

docker 如果启动容器失败,就先删除容器,删除目录,再次执行安装。

二、使用docker安装Elasticsearch

1:获取镜像

bash;gutter:true; docker image pull delron/elasticsearch-ik:2.4.6-1.0</p> <pre><code> 如果pull拉取很慢可以从我的百度云中下载,然后传到Linux系统中然后使用docker命令导入 [链接:https://pan.baidu.com/s/1zXBR_uHSFxK5xNxklGV1pQ](https://pan.baidu.com/s/1zXBR_uHSFxK5xNxklGV1pQ%20) 提取码:96iw ;gutter:true;
docker load -i elasticsearch-ik-2.4.6_docker.tar

查看本地仓库是否有这个镜像

bash;gutter:true; docker images 或 docker image ls</p> <pre><code> 将下载的elasticsearch.zip上传到Linux系统中的家目录,然后解压。在目录中的elasticsearch/config/elasticsearch.yml第54行更改IP地址为0.0.0.0,端口改为8002,默认为9002 解压命令: ;gutter:true;
unzip elasticsearch.zip

2:创建docker容器并运行

根据拉取到本地的镜像创建容器,需要将elasticsearch/config配置文件所在目录修改为你自己的路径

bash;gutter:true; docker run -dti --network=host --name=elasticsearch -v /home/上面上传后解压出来的文件路径地址/elasticsearch/config:/usr/share/eleaticsearh/config delron/elasticsearch-ik:2.4.6-1.0</p> <pre><code> 查看是否创建成功,如果STATUS为Up则创建成功 ;gutter:true;
docker container ls -a 或 docker ps -a

python-django框架中使用docker和elasticsearch配合实现搜索功能

测试 curl 127.0.0.1:8002

python-django框架中使用docker和elasticsearch配合实现搜索功能

3:进入项目的虚拟环境中,安装以下包

bash;gutter:true; pip install django-haystack pip install elasticsearch==2.4.1</p> <pre><code> **4:在django项目配置,在settings.py文件中加入下面配置。** 4-1:在INSTALLED_APPS节点中注册haystack ;gutter:true;
INSTALLED_APPS = [

‘haystack’,

]

4-2:加入配置

python;gutter:true; 建立连接ELASTICSEARCH_DSL = {  'default':{    'host':'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': 'mysite', # 指定elasticsearch建立的索引库的名称 }, }</p> <p>当添加、修改、删除数据时,自动生成索引,当数据库改变时候,会自动更新索引</p> <pre><code> ;gutter:true;
HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor’ # 每页显示多少条数据HAYSTACK_SEARCH_RESULTS_PER_PAGE = 20

5:建立索引

在需要创建索引的实体中创建search_indexes.py(文件名固定写法)

python-django框架中使用docker和elasticsearch配合实现搜索功能

5-1:search_indexes.py文件内容如下:

python;gutter:true; from haystack import indexes from .models import News # 导入模型类</p> <p>建索引类 模型名称+Index(固定的) class NewsIndex(indexes.SearchIndex, indexes.Indexable): ''' News索引数据库模型 ''' # 这个主要是使用5-2来建立索引 text = indexes.CharField(document=True, use_template=True) # 以下是为了在使用时 news.id 如果没有写就需要news.object.id 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')</p> <pre><code>def get_model(self): ''' 返回建立索引模型 ''' return News def index_queryset(self, using=None): ''' 返回要建立索引的数据查询集 :param using: :return: ''' return set.get_model().objects.filter(is_delete=False, tag_id=1) # return set.get_model().objects.filter(is_delete=False,tag_id=[1,2,3,4,5]) </code></pre> <pre><code> 5-2:创建模板 </code></pre> <p>需要在templates文件夹中创建一个search/indexes/app名称/模型名称小写_text.txt文件(固定结构)</p> <pre><code> ![python-django框架中使用docker和elasticsearch配合实现搜索功能](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/1145331-20190605153006123-1048166603.png) news_text.txt内容为:需要建立的索引 ![python-django框架中使用docker和elasticsearch配合实现搜索功能](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/1145331-20190605153115875-1787491170.png) **6:生成索引** 通过xshell进入项目进入虚拟环境执行 ;gutter:true;
python manage.py rebuild_index

python-django框架中使用docker和elasticsearch配合实现搜索功能

7: 分页搜索接口/方法

7-1

python;gutter:true; from haystack.views import SearchView as _SearchView from .models import News # 导入模型类 from .models import HotNews from mysite import setttings from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import render from django.views import View</p> <p>class SearchView(_SearchView): # 模板文件 template = 'news/search.html'</p> <pre><code># 重写响应方式,如果请求参数为空,返回模型News的热门新闻数据,否则根据参数q搜索相关数据 def create_response(self): kw = self.request.GET.get('q', '') if not kw: show_all = True hot_news = 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, setttings.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 </code></pre> <pre><code> 7-2:在app中的urls中设置url ;gutter:true;
path(‘search/’,view.SearchView(),name=’search’)

7-3:前端部分代码

html;gutter:true; {% if not show_all %}</p> <pre><code> 搜索结果 {{ paginator.num_pages }}页 {% for one_news in page.object_list %} {% highlight one_news.title with query %} {% highlight one_news.digest with query %} {{ one_news.object.tag.name }} {{ one_news.object.update_time }} {% highlight one_news.object.author.username with query %} {% endfor %} {% else %} 热门推荐 {% for one_hotnews in page.object_list %} {{ one_hotnews.news.title }} {{ one_hotnews.news.digest }} {{ one_hotnews.news.tag.name }} {{ one_hotnews.update_time }} {{ one_hotnews.news.author.username }} {% endfor %} {% endif %} {# 分页导航 #} {{ page.paginator.count }}条 {# 上一页的URL地址 #} {% if page.has_previous %} {% if query %} 上一页 {% else %} 上一页 {% endif %} {% endif %} {# 列出所有的URL地址 #} {% for num in page.paginator.page_range|slice:":10" %} {% if num == page.number %} {{ page.number }} {% else %} {% if query %} {{ num }} {% else %} {{ num }} {% endif %} {% endif %} {% endfor %} {# 如果页数大于10,则打两点 #} {% if page.paginator.num_pages > 10 %} .. {% if query %} {{ page.paginator.num_pages }} {% else %} {{ page.paginator.num_pages }} {% endif %} {% endif %} {# 下一页的URL地址 #} {% if page.has_next %} {% if query %} 下一页 {% else %} 下一页 {% endif %} {% endif %} </code></pre> <pre><code> 7-4:高亮及分页样式 ;gutter:true;
/* === current index start === */
#pages {
padding: 32px 0 10px;
}

.page-box {
text-align: center;
/*font-size: 14px;*/
}

#pages a.prev, a.next {
width: 56px;
padding: 0
}

#pages a {
display: inline-block;
height: 26px;
line-height: 26px;
background: #fff;
border: 1px solid #e3e3e3;
text-align: center;
color: #333;
padding: 0 10px
}

#pages .sel {
display: inline-block;
height: 26px;
line-height: 26px;
background: #0093E9;
border: 1px solid #0093E9;
color: #fff;
text-align: center;
padding: 0 10px
}

.highlighted{
color:coral;
mso-ansi-font-weight: bold;
}
/* === current index end === */

8:效果图

python-django框架中使用docker和elasticsearch配合实现搜索功能

Original: https://www.cnblogs.com/wendj/p/10979960.html
Author: begrateful
Title: python-django框架中使用docker和elasticsearch配合实现搜索功能

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576516/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 红黑树添加删除

    上一篇写了234树对比红黑树,和红黑树某些情况需要调整的原因,这篇就只写红黑树的添加和删除 红黑树 JAVA技术交流群:737698533 性质 每个节点要么红色要么黑色 根节点是…

    数据库 2023年6月16日
    055
  • AI听曲识歌!哼曲、口哨吹,都能秒识! ⛵

    💡 作者:韩信子@ShowMeAI📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42📘 自然语言处理实战系列:https://www…

    数据库 2023年6月14日
    0111
  • 设计模式之(11)——享元模式

    继续把我们的设计模式捡起,希望我能坚持完这个系列吧,下面我们就进入正题吧。 在软件开发过程中,我们需要重复使用某个对象的时候,如果重复地new这个对象,不停地申请内存空间,会造成内…

    数据库 2023年6月14日
    073
  • 视野 | KeyDB:为 Web 应用而生的高性能 Redis 分支

    王奇 顾问软件工程师目前从事 PaaS 中间件服务(Redis / MongoDB / ELK 等)开发工作,对 NoSQL 数据库有深入的研究以及丰富的二次开发经验,热衷对 No…

    数据库 2023年5月24日
    092
  • Null和空值对于avg计算时产生的影响以及处理

    为什么要关注这一块呢:1.面试中可能会有涉及 2.工作中真的也可能会用,既然有可能我也用过,就拿出来跟大家分享一下,上一篇的博文,数据已准备好就不做数据准备的介绍了。 step1:…

    数据库 2023年6月6日
    0106
  • MySQL行构造器

    子查询返回多列的办法 主要用途,项目中初版使用子查询返回一列用来限制主表,项目新版本中,表关联建改为多列时建议使用 Original: https://www.cnblogs.co…

    数据库 2023年6月9日
    079
  • 数据库死锁分析(行锁、间隙锁)

    分享因遇到缝隙锁而导致的死锁案例。文章最后有一个知识总结,以供参考。 [En] Share a deadlock case caused by a gap lock encount…

    数据库 2023年5月24日
    095
  • 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事

    前言 事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。 可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,…

    数据库 2023年6月16日
    094
  • ansible-复制模块

    简介:临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。 1、复制模块 可在终端执行ansible-doc copy…

    数据库 2023年6月14日
    086
  • Go编译过程

    一、 Go编译流程 二、过程说明 词法解析 读取Go源文件,将字符序列转换为符号(token)序列,比如将”:=”转换为_Define 代码中的标识符、关键…

    数据库 2023年6月14日
    080
  • 优化 JS 程序的一个小方法

    就像在学习之前先要识字,我想在介绍优化 JavaScript 代码之前,先介绍一下自己对编程语言的理解。故事要从一只叫做 Theseus 的机械鼠和其发明人克劳德-香农(Claud…

    数据库 2023年6月14日
    092
  • mysql事物

    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些…

    数据库 2023年6月9日
    083
  • Docker安装部署Mysql8(以作数据持久化)

    1.创建容器并进行持久化处理 #拉取镜像 docker pull mysql:8.0.20 #启动镜像,用于拷贝配置文件到宿主机 docker run -p 3306:3306 -…

    数据库 2023年6月11日
    0106
  • leetcode 637. Average of Levels in Binary Tree 二叉树的层平均值(简单)

    一、题目大意 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root = [3,…

    数据库 2023年6月16日
    080
  • python爬取博客圆首页文章链接+标题

    新人一枚,初来乍到,请多关照 来到博客园,不知道写点啥,那就去瞄一瞄大家都在干什么好了。 使用python 爬取博客园首页文章链接和标题。 首先当然是环境了,爬虫在window10…

    数据库 2023年6月11日
    0123
  • 09 子查询

    数据库关联子查询和非关联子查询 非关联子查询:数据库嵌套查询中内层查询是完全独立于外层查询的。 执行顺序: 先执行内层查询 得到内层查询的结果后带入外层,再执行外层查询 selec…

    数据库 2023年6月16日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球