Django:Elasticsearch搜索系统的使用
Docker install ElasticSearch
Django:haystack全文检索详细教程
使用Docker
安装Elasticsearch
及其扩展
创建
Docker
镜像
docker run -dit --name=myubuntu es 复制代码
安装
ElasticSearch
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.4/elasticsearch-2.4.4.tar.gz 复制代码
tar -xzvf elasticsearch-2.4.4.tar.gz -C /usr/local cd /usr/local/elasticsearch-2.4.4 复制代码
cd conf vi elasticsearch.yml 复制代码
bootstrap.memory_lock: true index.cache.field.max_size: 50000 index.cache.field.expire: 30m index.cache.field.type: soft network.host: 0.0.0.0,127.0.0.1 action.disable_delete_all_indices : true 复制代码
cd ../bin //直接启动ElasticSearch ./elasticsearch //或者使用后台方式进行启动 ./elasticsearch -d 复制代码
通常
ES
会使用9200和9300端口,查看端口占用情况:netstat -anp|grep 9200 复制代码
result:
root@192.168.*.25:/usr/local/elasticsearch-2.4.4/bin# netstat -anp|grep 9200 tcp 0 0 192.168.*.58:9200 0.0.0.0:* LISTEN 11135/java tcp 0 0 127.0.0.1:9200 0.0.0.0:* LISTEN 11135/java 复制代码
docker exit docker container ls --all 复制代码
安装完毕,退出和查看正在运行的容器列表
安装启动
ES
更新
ES
配置点击跳转到其他版本和系统下载地址
解压
下载
使用Haystack
对接Elasticsearch
我们在
Django
中可以通过使用haystack
来调用Elasticsearch
搜索引擎。安装
pip install drf-haystack pip install elasticsearch==2.4.1 复制代码
注册应用
INSTALLED_APPS = [ ... 'haystack', ... ] 复制代码
修改配置文件
settings.py
# Haystack HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200 'INDEX_NAME': 'XXXXXX', # 指定elasticsearch建立的索引库的名称 }, } # 当添加、修改、删除数据时,自动生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' 复制代码
使用Elasticsearch
完成商品搜索
创建索引类
通过创建索引类,知名搜索引擎可以通过哪些字段的关键字来检索数据。
from haystack import indexes from goods.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) 复制代码
手动生成初始索引
具体在
templates/search/indexes/goods/sku_text.txt
文件中定义。{{ object.name }} {{ object.title }} {{ object.detail }} 复制代码
python manage.py rebuild_index 复制代码
手动生成初始化索引
在
templates
目录中创建text
字段使用的模板文件定义路由
url
router = DefaultRouter() router.register('skus/search', views.SKUSearchViewSet, base_name='skus_search') urlpatterns += router.urls 复制代码
创建视图
from drf_haystack.viewsets import HaystackViewSet class SKUSearchViewSet(HaystackViewSet): """ SKU搜索 """ index_models = [SKU] serializer_class = SKUIndexSerializer 复制代码
测试
使用路由进入接口测试
http://localhost:8000/skus/search/?text=测试商品 复制代码
bug
修复
haystack
对Elasticsearch
版本的匹配问题。 可以通过修改REST framework框架代码,补充_get_count
函数定义即可。
文件路径 pyenv
环境下的 lib/python3.9/site-packages/rest_framework/pagination.py
def _get_count(queryset): """ Determine an object count, supporting either querysets or regular lists. """ try: return queryset.count() except (AttributeError, TypeError): return len(queryset)
作者:阿九筒的春天
链接:https://juejin.cn/post/7017676155863957517