django项目配置使用elasticsearch搜索引擎

django项目配置使用elasticsearch搜索引擎Elasticsearc 简称 ES 是一个基于 Lucene 实现的开源 分布式 Restful 的全文本搜索引擎 此外 它还是一个分布式实时文档存储 其中每个文档的每个 field 均是被索引的数据 且可被搜索 也是一个带实时分析功能的分布式搜索引擎 能够扩展至数以百计的节点实时处理 PB 级的数据 基本组件索引 index 文档容器 换句话说 索引是具有类似属性的文档的集合 类似新华字典的索引检索页 里面包含了关键词与词条的对应关系 并记录词条的位置 索引名必须使用小写字母 搜索

Elasticsearch

Elasticsearch(简称ES)是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎;此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。

基本组件

索引(index):文档容器,换句话说,索引是具有类似属性的文档的集合。类似新华字典的索引检索页,里面包含了关键词与词条的对应关系,并记录词条的位置。索引名必须使用小写字母; 搜索引擎进行全文检索时,将关键字在索引数据中进行快速对比查找,进而找到数据的真实存储位置。

类型(type):类型是索引内部的逻辑分区,其意义完全取决于用户需求。一个索引内部可定义 一个或多个类型。一般来说,类型就是拥有相同的域的文档的预定义。

文档(document):文档是Lucene索引和搜索的原子单位,它包含了一个或多个域。是域的容器;基于JSON格式表示。(每个域的组成部分:一个名字,一个或多个值;拥有多个值的域,通常称为多值域;)

映射(mapping):原始内容存储为文档之前需要事先进行分析,例如切词(将一句话拆解成多个单字或词)、过滤掉某些词等; 映射用于定义此分析机制该如何实现;除此之外,ES还为映射提供了诸如将域中的内容排序等功能。

ES的集群组件

Cluster:ES的集群标识为集群名称;默认为”elasticsearch”。节点就是靠此名字来决定加入到哪个集群中。一个节点只能属性于一个集群。

Node:运行了单个ES实例的主机即为节点。用于存储数据、参与集群索引及搜索操作。节点的标识靠节点名。

Shard:将索引切割成为的物理存储组件;但每一个shard都是一个独立且完整的索引;创建 索引时,ES默认将其分割为5个shard,用户也可以按需自定义,创建完成之后不可修改。shard有两种类型:primary shard和replica。Replica用于数据冗余及查询时的负载均衡。每个主shard的副本数量可自定义,且可动态修改。

使用Docker安装Elasticsearch

  1. 拉取镜像

    docker image pull delron/elasticsearch-ik:2.4.6-1.0

  2. 运行容器

    docker run -d –name=elasticsearch –network=host -v /root/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0

  3. 编辑配置文件
  4. 给映射目录添加权限
  5. 重启容器

    docker container restart elasticsearch

使用haystack对接ES

Django中可以通过使用 Haystack 来调用 Elasticsearch 搜索引擎。Haystack 可以在不修改代码的情况下使用不同的搜索后端(比如 Elasticsearch、Whoosh、Solr等等)。

  1. Haystack安装
    pip install django-haystack pip install elasticsearch==2.4.1 
  2. Haystack注册应用和路由
     INSTALLED_APPS = [ 'haystack', # 全文检索 ] # 总路由 url(r'^search/', include('haystack.urls')), 
  3. 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建立的索引库的名称 }, } # 当添加、修改、删除数据时,自动生成索引,保证了在Django运行起来后, 有新的数据产生时,Haystack仍然可以让Elasticsearch实时生成新数据的索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # haystack分页 HAYSTACK_SEARCH_RESULTS_PER_PAGE = 6 
  4. haystack建立数据索引

通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。本项目中对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说明:

  1. 创建text字段索引值模板文件

在templates目录中创建text字段使用的模板文件,在templates/search/indexes/goods(子应用名称小写)/sku(被索引模型类名称小写)_text.txt文件中定义

{ 
   { 
    object.id }} { 
   { 
    object.name }} { 
   { 
    object.caption }} 
  1. 手动生成初始索引
python manage.py rebuild_index 
  1. 前端渲染搜索结果
{% for result in page %} <li> {# object取得才是sku对象 #} <a href="/detail/{ 
    { result.object.id }}/"><img src="{ 
    { result.object.default_image.url }}"></a> <h4><a href="/detail/{ 
    { result.object.id }}/">{ 
  { result.object.name }}</a></h4> <div class="operate"> <span class="price">¥{ 
  { result.object.price }}</span> <span>{ 
  { result.object.comments }}评价</span> </div> </li> {% else %} <p>没有找到您要查询的商品。</p> {% endfor %} 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233250.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java注解生成xml和包含CDATA问题

    百度java生成xml,有一大推的文章,主要的生成方式一种使用Dom4J ,还有一种使用Jdk自带注解类! 下面主要整理我注解类的使用,(可以参考这篇文章Dom4J生成xml和包含CDATA问题)和xml中CDATA 问题的解决方法!

    2022年2月25日
    259
  • 牛顿迭代法应用——求数的平方根和立方根

    牛顿迭代法应用——求数的平方根和立方根

    2022年2月5日
    54
  • anaconda添加清华镜像源_anaconda清华镜像源

    anaconda添加清华镜像源_anaconda清华镜像源在安装tensorflow时,不知道怎么了,一直安装不上去,所以重新配置了下镜像安装环境:win10+anaconda3.5删除之前的镜像源,恢复默认状态condaconfig–remove-keychannels添加清华镜像源清华大学开源软件镜像站#添加镜像源condaconfig–addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/maincondaconfig–addchann

    2025年6月25日
    4
  • era教程_erdas2015使用教程

    era教程_erdas2015使用教程SpringCloudEureka配置文件详解本篇内容用来说明Eureka常用配置的含义。以下配置都是以eureka.server开头:参数 描述 备注 eureka.server.eviction-interval-timer-in-ms server清理无效节点的时间间隔 默认60秒 eureka.server.enable-self-preservation 是否开启自我保护,默认true truefalse eureka.ser..

    2022年8月21日
    11
  • IDEA的优化配置

    IDEA的优化配置前言IDEA全称IntelliJIDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说是超常的。idea的优化可以使我们更得心应手的高效开发设置优化方法分割线一个文件可能会有一个或多个方法,堆积在一起使人眼花缭乱。方法分割线可以是我们快速区分方法。File——Setting——Edi

    2022年5月21日
    50
  • activity跳转activity不销毁

    activity跳转activity不销毁最近在做菜单,有三个界面分别用activity来显示,如ActivityA -> ActivityB -> ActivityC,返回键ActivityC -> ActivityB -> ActivityA,当从A进入到B时按返回键无法退到A,是因为在A进入B时用了finish()方法,把A给销毁了,如下:finish();IntentaToB=newI

    2022年5月22日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号