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)
上一篇 2025年8月4日 上午9:01
下一篇 2025年8月4日 上午9:22


相关推荐

发表回复

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

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