django使用haystack来调用Elasticsearch搜索引擎

Posted x931890193

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django使用haystack来调用Elasticsearch搜索引擎相关的知识,希望对你有一定的参考价值。

如何使用django来调用Elasticsearch实现全文的搜索

  环境:django ==1.11.11

  Haystack为Django提供了模块化的搜索。它的特点是统一的,熟悉的API,可以让你在不修改代码的情况下使用不同的搜索后端(比如 Solr, Elasticsearch, Whoosh, Xapian 等等)。

  1.首先安装相关的依赖包:

pip install drf-haystack
pip install elasticsearch==2.4.1

  2. 在django项目配置文件中注册应用:

INSTALLED_APPS = [
    ...
    haystack,
    ...
]

  3.在django项目配置文件中指定搜索的后端:

# Haystack
HAYSTACK_CONNECTIONS = {
    default: {
        ENGINE: haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine,
        URL: http://your_ip:9200/,  # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
        INDEX_NAME: demo,  # 指定elasticsearch建立的索引库的名称
    },
}

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = haystack.signals.RealtimeSignalProcessor

4.创建索引类:

from haystack import indexes

from .models import Demomodel


class DemoIndex(indexes.SearchIndex, indexes.Indexable):
    """
    索引数据模型类
    """
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        """返回建立索引的模型类"""
        return Demomodel

    def index_queryset(self, using=None):
        """返回要建立索引的数据查询集"""
        return self.get_model().objects.filter(is_launched=True)
"""

说明: 
  在DemoIndex建立的字段,都可以借助haystack由elasticsearch搜索引擎查询。   其中text字段声明为document
=True,表名该字段是主要进行关键字查询的字段, 该字段的索引值可以由多个数据库模型类字段组成,具体由哪些模型类字段组成,我们用use_template=True表示后续通过模板来指明。   在REST framework中,索引类的字段会作为查询结果返回数据的来源 """

5. 在templates目录中创建text字段使用的模板文件

templates/search/indexes/demo/demo_text.txt文件中定义

{{ object.name }}
{{ object.id }}

6.创建haystack序列化器

from drf_haystack.serializers import HaystackSerializer

class DemoSerializer(serializers.ModelSerializer):
    """
    序列化器
    """
    class Meta:
        model = Demo
        fields = (id, name)

class DemoIndexSerializer(HaystackSerializer):
    """
    SKU索引结果数据序列化器
    """
    object = DemoSerializer(read_only=True)

    class Meta:
        index_classes = [DemoIndex]
        fields = (text, object)

7.创建视图

from drf_haystack.viewsets import HaystackViewSet

class DemoSearchViewSet(HaystackViewSet):
    index_models = [Demo]

    serializer_class = DemoIndexSerializer

8. 添加路由,使用通过REST framework的router来定义路由

router = DefaultRouter()
router.register(/, views.DemoSearchViewSet, base_name=demo_search)

...

urlpatterns += router.urls

9.测试

http://127.0.0.1:8000/?text=something

 

以上是关于django使用haystack来调用Elasticsearch搜索引擎的主要内容,如果未能解决你的问题,请参考以下文章

商品搜索

全文检索 部署及使用

Django之使用haystack+whoosh实现搜索功能

django使用全文搜索引擎haystack+jieba分词

Django:关于使用 Solr 和 Haystack 的问题

Django-cms haystack 搜索 - 占位符内容