Django模型管理器,用于Elasticsearch集成
项目描述
# elasticmanager
将ORM转换为Elasticsearch的管理器
*此包仍在积极开发中。目前它被构建为Django ORM的混入。然而,一旦稳定,它将被抽象化,以便能够插入到其他ORM中。*
此包需要`elasticsearch-dsl`,您可以通过以下方式获得
pip install elasticsearch-dsl
## 入门
1. 要开始,从pip安装。
pip安装elasticmanager
1. 将`elasticmanager`添加到您的`settings.py`(这启用了管理命令)。
1. 在`settings.py`中放入您的索引名称:`ELASTICSEARCH_INDEX = 'myindex'`
1. 从`elasticmanager.ElasticModel`派生。
```python
from django.db import models
from elasticmanager.models import ElasticModel
class Visitor(ElasticModel, models.Model)
name = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True, editable=False)
```
1. 在与相应的`models.py`相同的应用中创建一个`doctypes.py`。
向此文件添加一个与您的模型同名的`DocType`。(有关创建`DocType`的更多信息,请参阅[Elasticsearch DSL文档](https://elasticsearch-dsl.elastic.ac.cn/en/latest/persistence.html#doctype))
```python
from django.conf import settings
from elasticmanager.doctypes import BaseDocType
from . import models
class Visitor(BaseDocType)
pk = field.Keyword()
name = field.Keyword()
created = field.Date()
class Meta
model = models.Visitor
index = settings.ELASTICSEARCH_INDEX
```
请注意,`doctype`的`Meta`信息应链接到`model`和`index`。
1. 运行`./manage.py rebuild_mapping`
1. 运行`./manage.py rebuild_indexing`(如果有需要索引的DB项)
还有一个管理命令(`./manage.py remove_index <NAME>`),可以用于删除整个索引。在开发阶段非常有用。
目前,对模型实例上的 `.save()` 方法的所有调用都会触发 doctype 的 `.save()`,因此将保持 Elasticsearch 中的索引是最新的。
## 查询和过滤调用
调用与默认 Django 语法大致相同。
**获取所有实例**
```python
visitors = Visitor.elastic.all() # 从 Elasticsearch 返回所有内容
```
**获取一个实例**
```python
visitor = Visitor.elastic.get(pk=123) # 根据特定的键从 Elasticsearch 返回一个实例
visitor = Visitor.elastic.first() # 返回查询集中的第一个实例
visitor = Visitor.elastic.last() # 返回查询集中的最后一个实例
```
**计数实例数量**
```python
count = Visitor.elastic.count() # 计数查询集中的实例数量
```
**过滤/查询** *这与 [查询](https://elasticsearch-dsl.elastic.ac.cn/en/latest/search_dsl.html#queries) 和 [过滤](https://elasticsearch-dsl.elastic.ac.cn/en/latest/search_dsl.html#filters) 方法相匹配。有关更多信息,请参阅相关文档.*
```python
johns = Visitor.elastic.filter(name="John") # 从 Elasticsearch 返回所有内容
```
**链式调用适用**
```python
first_john = Visitor.elastic.filter(name="John").first()
```
内部有一个 `execute()` 方法正在提交搜索。这可以单独调用,如果您(例如)正在操作查询集,那么可能应该这样做。但是,如果您正在调用 `count()` 或遍历结果集,则不需要调用它。
```python
johns = Visitor.elastic.filter(name="John")
for john in johns
print(john)
# 或
johns = Visitor.elastic.filter(name="John")
johns.execute()
print(johns.results)
```
*这个要求将在进一步调整以使其更直观之后被移除.*
## 未来计划
- 从使用 `models.Manager` 中抽象
- 修复类工厂,以便 `Model` 可以自动转换为 `DocType`,而无需在 `doctypes.py` 中定义它。
- 测试
- 聚合
- 扩展异常处理
- 更多管理命令
- 更强大的 API
如果您有任何问题、想法、投诉或赞美,请告诉我。
将ORM转换为Elasticsearch的管理器
*此包仍在积极开发中。目前它被构建为Django ORM的混入。然而,一旦稳定,它将被抽象化,以便能够插入到其他ORM中。*
此包需要`elasticsearch-dsl`,您可以通过以下方式获得
pip install elasticsearch-dsl
## 入门
1. 要开始,从pip安装。
pip安装elasticmanager
1. 将`elasticmanager`添加到您的`settings.py`(这启用了管理命令)。
1. 在`settings.py`中放入您的索引名称:`ELASTICSEARCH_INDEX = 'myindex'`
1. 从`elasticmanager.ElasticModel`派生。
```python
from django.db import models
from elasticmanager.models import ElasticModel
class Visitor(ElasticModel, models.Model)
name = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True, editable=False)
```
1. 在与相应的`models.py`相同的应用中创建一个`doctypes.py`。
向此文件添加一个与您的模型同名的`DocType`。(有关创建`DocType`的更多信息,请参阅[Elasticsearch DSL文档](https://elasticsearch-dsl.elastic.ac.cn/en/latest/persistence.html#doctype))
```python
from django.conf import settings
from elasticmanager.doctypes import BaseDocType
from . import models
class Visitor(BaseDocType)
pk = field.Keyword()
name = field.Keyword()
created = field.Date()
class Meta
model = models.Visitor
index = settings.ELASTICSEARCH_INDEX
```
请注意,`doctype`的`Meta`信息应链接到`model`和`index`。
1. 运行`./manage.py rebuild_mapping`
1. 运行`./manage.py rebuild_indexing`(如果有需要索引的DB项)
还有一个管理命令(`./manage.py remove_index <NAME>`),可以用于删除整个索引。在开发阶段非常有用。
目前,对模型实例上的 `.save()` 方法的所有调用都会触发 doctype 的 `.save()`,因此将保持 Elasticsearch 中的索引是最新的。
## 查询和过滤调用
调用与默认 Django 语法大致相同。
**获取所有实例**
```python
visitors = Visitor.elastic.all() # 从 Elasticsearch 返回所有内容
```
**获取一个实例**
```python
visitor = Visitor.elastic.get(pk=123) # 根据特定的键从 Elasticsearch 返回一个实例
visitor = Visitor.elastic.first() # 返回查询集中的第一个实例
visitor = Visitor.elastic.last() # 返回查询集中的最后一个实例
```
**计数实例数量**
```python
count = Visitor.elastic.count() # 计数查询集中的实例数量
```
**过滤/查询** *这与 [查询](https://elasticsearch-dsl.elastic.ac.cn/en/latest/search_dsl.html#queries) 和 [过滤](https://elasticsearch-dsl.elastic.ac.cn/en/latest/search_dsl.html#filters) 方法相匹配。有关更多信息,请参阅相关文档.*
```python
johns = Visitor.elastic.filter(name="John") # 从 Elasticsearch 返回所有内容
```
**链式调用适用**
```python
first_john = Visitor.elastic.filter(name="John").first()
```
内部有一个 `execute()` 方法正在提交搜索。这可以单独调用,如果您(例如)正在操作查询集,那么可能应该这样做。但是,如果您正在调用 `count()` 或遍历结果集,则不需要调用它。
```python
johns = Visitor.elastic.filter(name="John")
for john in johns
print(john)
# 或
johns = Visitor.elastic.filter(name="John")
johns.execute()
print(johns.results)
```
*这个要求将在进一步调整以使其更直观之后被移除.*
## 未来计划
- 从使用 `models.Manager` 中抽象
- 修复类工厂,以便 `Model` 可以自动转换为 `DocType`,而无需在 `doctypes.py` 中定义它。
- 测试
- 聚合
- 扩展异常处理
- 更多管理命令
- 更强大的 API
如果您有任何问题、想法、投诉或赞美,请告诉我。