阅读 211

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修复

haystackElasticsearch版本的匹配问题。 可以通过修改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


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐