社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

如何在Django中使用ElasticSearch

马哥Linux运维 • 3 年前 • 466 次点击  

什么是Elasticsearch?

Elasticsearch是基于Lucene库的搜索引擎。它提供了具有HTTP Web界面和无模式JSON文档的分布式,多租户功能的全文本搜索引擎。Elasticsearch是用Java开发的。

Elasticsearch的用途是什么?

Elasticsearch可以使我们快速,近乎实时地存储,搜索和分析大量数据,并在几毫秒内给出答复。之所以能够获得快速的搜索响应,是因为它可以直接搜索索引,而不是直接搜索文本。

Elasticsearch-一些基本概念

索引—不同类型的文档和文档属性的集合。例如,文档集可以包含社交网络应用程序的数据。

类型/映射-共享共享同一索引中存在的一组公共字段的文档集合。例如,索引包含社交网络应用程序的数据;对于用户个人资料数据,可以有一种特定的类型,对于消息传递数据,可以有另一种类型,对于注释数据,可以有另一种类型。

文档-以特定方式以JSON格式定义的字段的集合。每个文档都属于一种类型,并且位于索引内。每个文档都与唯一的标识符(称为UID)相关联。

字段-Elasticsearch字段可以包含多个相同类型的值(本质上是一个列表)。另一方面,在SQL中,一列可以恰好包含所述类型的一个值。

在Django中使用Elasticsearch

安装和配置,安装Django Elasticsearch DSL:

$ pip install django-elasticsearch-dsl

然后将django_elasticsearch_dsl添加到INSTALLED_APPS

必须在django设置中定义ELASTICSEARCH_DSL。

例如:

ELASTICSEARCH_DSL={
    'default': {
        'hosts''localhost:9200'
    },
}

声明要索引的数据,然后创建model:

# models.py

class Category(models.Model):
    name = models.CharField(max_length=30)
    desc = models.CharField(max_length=100, blank=True)
def __str__(self):
    return '%s' % (self.name)

要使该模型与Elasticsearch一起使用,请创建django_elasticsearch_dsl.Document的子类,在Document类中创建一个Index类以定义我们的Elasticsearch索引,名称,设置等,最后使用Registry.register_document装饰器注册该类。它需要在应用目录中的documents.py中定义Document类。
# documents.py

from django_elasticsearch_dsl import Document
from django_elasticsearch_dsl.registries import registry
from .models import Category

@registry.register_document
class CategoryDocument(Document):
    class Index:
        name = 'category'
    settings = {
        'number_of_shards'1,
        'number_of_replicas'0
    }
    class Django:
         model = Category
         fields = [
             'name',
             'desc',
         ]

填充:
要创建和填充Elasticsearch索引和映射,请使用search_index命令:
$python manage.py search_index — rebuild

要获得更多帮助,请使用命令:
$ python manage.py search_index —help

现在,当执行以下操作时:
category = Category(
    name="Computer and Accessories",
    desc="abc desc"
)
category.save()
该对象也将保存在Elasticsearch中(使用信号处理程序)。

搜索:
要获取elasticsearch-dsl-py搜索实例,请使用:
s = CategoryDocument.search().filter("term", name="computer")

# or

s = CategoryDocument.search().query("match", description="abc")

for hit in s:
    print(
        "Category name : {}, description {}".format(hit.name, hit.desc)
    )
要将弹性搜索结果转换为真实的Django查询集,请注意,这会花费一个SQL请求来检索具有由Elasticsearch查询返回的ID的模型实例。
s = CategoryDocument.search().filter("term", name="computer")[:30]
qs = s.to_queryset()
# qs is just a django queryset and it is called with order_by to keep
# the same order as the elasticsearch result.
for cat in qs:
    print(cat.name)
完毕,如果有任何疑问,欢迎留言交流。
文章转载:Python运维技术

(版权归原作者所有,侵删)


点击下方“阅读原文”查看更多

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115298
 
466 次点击