全文检索

服务器起es服务

第一步:拉取镜像

docker image pull delron/elasticsearch-ik:2.4.6-1.0

第二步:运行容器

docker run -d -p 9200:9200 --name search delron/elasticsearch-ik:2.4.6-1.0



windows 下安装jdk 1.8版本
elasticsearch  2.4.6版本
pip3 install elasticsearch==2.4.1
下载对应版本的ik分词器
 

Django 配置es

第一步:安装依赖包

pip3 install drf-haystack 
pip3 install elasticsearch==2.4.1
pip3 install djangorestframework

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

INSTALLED_APPS = [
    ...
    'app01.apps.App01Config',        
    'haystack',
    'rest_framework'
]

第三步:在django项目配置文件settings.py中指定搜索的后端


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

# 搜索结果每页显示数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
# 实时更新index
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

第四步:创建索引model类

在此之前要先创建model类,并插入数据

class TestData(models.Model):
    title = models.CharField(max_length=20)
    content = models.TextField()
    cate = models.CharField(max_length=10)

    class Meta:
        db_table = 'testdata'


在需要进行索引的应用的目录下创建文件search_indexes.py, 在该文件内创建该索引类

我在minapp应用下创建:search_indexes.py

索引模型类的名称必须是 模型类名称 + Index
from haystack import indexes
from .models import TestData

# 索引类
class BookIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

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

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

第五步:在templates目录中创建text字段使用的模板文件

创建文件templates/search/indexes/APP名称/model类名称加上_text.txt文件中定义

在这里插入图片描述


{{ object.title }}
{{ object.content }}

第六步:手动更新索引

TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR, 'templates')
}
]


es版本5.0以上不支持string属性,使用以下命令读取时会报错
python manage.py rebuild_index   #数据库有多少条数据,全部会被同步到es中  

第七步:创建saystack序列化器

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

from minapp import models

from minapp.search_indexes import TestData, BookIndex


class TestSerializer(ModelSerializer):
    class Meta:
        model = models.TestData
        fields = '__all__'


class TestIndexSerializer(HaystackSerializer):
    object = TestSerializer(read_only=True)  # 只读,不可以进行反序列化

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




第八步:创建视图类

from drf_haystack.viewsets import HaystackViewSet
from minapp.models import TestData
from minapp.mySer import TestIndexSerializer
class BookSearchView(HaystackViewSet):
    index_models = [TestData]    # 数据库模型类

    serializer_class = TestIndexSerializer     #saystack序列化器
 

第九步:添加路由

'''es '''
from rest_framework import routers
from minapp.views import BookSearchView
router = routers.DefaultRouter()
router.register("es", BookSearchView, basename="book-search")

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hh', Index.as_view()),
    # whoosh
    # path('whoosh/', basic_search),
]

'''es '''
urlpatterns += router.urls
 

 

 
 
 
 

posted on 2021-02-20 21:08  Plyc  阅读(88)  评论(0)    收藏  举报

导航