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)