es分词插件ik分词器使用方式

ik分词器源码链接GitHub https://github.com/infinilabs/analysis-ik

主要作用

es默认就支持将一段文章进行分词
在我们系统中会将分词存到数据库的标签表 suncool_node_opening_tags
将标签表和文章进行关联后可以对想要查询的文章进行过滤
目前存在分词不准确的问题(想分出来的没分,不想分的分出来了)
为解决这个问题新建了一个表来存储想要分或者不分的词 suncool_system_ik
并向外提供了接口
配置好ik插件的接口地址后,ik插件会定期轮询请求分词有没有变化的接口
一旦发现改变就会重新将变动的分词加入或者剔除

具体实现

安装

  • 当前已经将ik插件安装到es中了,具体怎么安装的
    有兴趣可以参考上面的GitHub链接

配置

  • 已经配置好停止词的请求接口,要添加的词的请求接口
    有兴趣可以参考上面的GitHub链接

添加的词(想要分出来)

  • 增删改查 都是操作的数据库 框架里面带了 不再具体解释
  • ik分词请求的字典文件 .dic
    接口地址:/system/ik/ik_word/
    请求方式:Get response 中设置了 ['Last-Modified'] ['ETag'] ik插件会先读取这两个参数的值有变动才会下载 这个字典文件.dic 这个字典文件就是把数据库中是需要分的词都查出来并且用 \n 进行换行
def ik_file_response(iks):
    """
    Last-Modified是上次更新时间
    ETag是实体标签(Entity Tag)的缩写,根据实体内容(文本数据)生成的一段hash字符串,
    可以通过它的标识数据的修改状态,当数据发生改变时,ETag也随之改变
    """
    # 数据库里面的分词内容
    dic_content = ''
    # 最后一次修改时间 根据ik数据库中最新的一条数据来
    last_modified = ''
    # dic_content的哈希摘要
    e_tag = ''
    if iks:
        last_modified = http_date(iks[0].update_datetime.timestamp())
        dic_content = "\n".join([ik.ext_word for ik in iks])
        e_tag = f'"{last_modified}-{len(dic_content)}"'
    response = HttpResponse(dic_content, content_type='application/octet-stream')
    response['Last-Modified'] = last_modified
    response['ETag'] = e_tag
    # 设置 Content-Disposition 头让浏览器下载该文件,并指定文件名
    response['Content-Disposition'] = 'attachment; filename="custom.dic"'
    return response

@action(methods=['GET'], detail=False, permission_classes=[], extra_filter_class=[])
def ik_word(self, request, *args, **kwargs):
    iks = Ik.objects.filter(is_stop=False).all()
    return ik_file_response(iks)

停止词(以前能分出来加上后分不出来)

  • 增删改查 都是操作的数据库 框架里面带了 不再具体解释
  • ik分词请求的字典文件 .dic
    接口地址:/system/ik/ik_stop_word/
    请求方式:Get response 中设置了 ['Last-Modified'] ['ETag'] ik插件会先读取这两个参数的值有变动才会下载 这个字典文件.dic 这个字典文件就是把数据库中是停止词都查出来并且用 \n 进行换行
def ik_file_response(iks):
    """
    Last-Modified是上次更新时间
    ETag是实体标签(Entity Tag)的缩写,根据实体内容(文本数据)生成的一段hash字符串,
    可以通过它的标识数据的修改状态,当数据发生改变时,ETag也随之改变
    """
    # 数据库里面的分词内容
    dic_content = ''
    # 最后一次修改时间 根据ik数据库中最新的一条数据来
    last_modified = ''
    # dic_content的哈希摘要
    e_tag = ''
    if iks:
        last_modified = http_date(iks[0].update_datetime.timestamp())
        dic_content = "\n".join([ik.ext_word for ik in iks])
        e_tag = f'"{last_modified}-{len(dic_content)}"'
    response = HttpResponse(dic_content, content_type='application/octet-stream')
    response['Last-Modified'] = last_modified
    response['ETag'] = e_tag
    # 设置 Content-Disposition 头让浏览器下载该文件,并指定文件名
    response['Content-Disposition'] = 'attachment; filename="custom.dic"'
    return response

@action(methods=['GET'], detail=False, permission_classes=[], extra_filter_class=[])
def ik_stop_word(self, request, *args, **kwargs):
    iks = Ik.objects.filter(is_stop=True).all()
    return ik_file_response(iks)