Django 使用es实现全文检索


django 对接elasticsearch实现全文检索

 

本文demo代码请加群获取

第一步:安装elasticsearch环境(docker安装)

Copy
pip3 install drf-haystack 
pip3 install elasticsearch
pip3 install djangorestframework

第三步:在django项目配置文件settings.py中注册应用

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

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
 # 指定搜索结果每页的条数
 # HAYSTACK_SEARCH_RESULTS_PER_PAGE = 1

第五步:创建索引类

创建文件templates/search/indexes/app01/book_text.txt文件中定义

Copy
{{ object.name }}
{{ object.publish }}

第七步:手动更新索引

Copy
from drf_haystack.serializers import HaystackSerializer
from rest_framework.serializers import ModelSerializer

from app01 import models

from app01.search_indexes import BookIndex
class BookSerializer(ModelSerializer):
    class Meta:
        model=models.Book
        fields='__all__'
class BookIndexSerializer(HaystackSerializer):
    object = BookSerializer(read_only=True) # 只读,不可以进行反序列化

    class Meta:
        index_classes = [BookIndex]# 索引类的名称
        fields = ('text', 'object')# text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text

第九步:创建视图类

Copy
from django.conf.urls import url
from django.contrib import admin
from rest_framework import routers

from app01.views import BookSearchView
router = routers.DefaultRouter()
router.register("book/search", BookSearchView, base_name="book-search")
urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

urlpatterns += router.urls

第十一步:测试

Copy
http://127.0.0.1:8000/?text=北  #查询出名字中和出版社中有北的数据

image-20191105223450063