# -*- coding: utf-8 -*-
"""
File Name: build_qa_database
Description : 在ES中构建问答库
Author : MeteorMan
date: 2019/12/2
"""
import os
import time
import json
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
class ProcessIntoES(object):
def __init__(self, ip="127.0.0.1"):
self._index = "law_qa_test_1" #相当于创建的MySQL数据库名称
# 无用户名密码状态
self.es = Elasticsearch([ip], port=9200)
# 用户名密码状态
# self.es = Elasticsearch([ip], http_auth=('admin', '123456'), port=9200)
self.doc_type = "qa" #相当于在指定数据库中创建的表名称
cur = '/'.join(os.path.abspath(__file__).split('/')[:-1])
self.music_file = os.path.join(cur, 'data/qa_corpus.json')
'''创建ES索引,确定分词类型'''
'''
两种分词器使用的最佳实践是:索引时用ik_max_word,在搜索时用ik_smart。
即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。
'''
def create_mapping(self):
node_mappings = {
"mappings": {
self.doc_type: { # type
"properties": {
"question": { # field: 问题
"type": "text", # lxw NOTE: cannot be string
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"index": "true" # The index option controls whether field values are indexed.
},
"category": { # field: 类别
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"index": "true"
},
"answers": { # field: 答案
"type": "text", # lxw NOTE: cannot be string
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"index": "true" # The index option controls whether field values are indexed.
},
}
}
}
}
if not self.es.indices.exists(index=self._index):
self.es.indices.create(index=self._index, body=node_mappings, ignore=[400, 409])
print("Create {} mapping successfully.".format(self._index))
else:
print("index({}) already exists.".format(self._index))
'''批量插入数据'''
def insert_data_bulk(self, action_list):
success, _ = bulk(self.es, action_list, index=self._index, raise_on_error=True)
print("Performed {0} actions. _: {1}".format(success, _))
'''初始化ES,将数据插入到ES数据库当中'''
def init_ES():
pie = ProcessIntoES()
# 创建ES的index
pie.create_mapping()
start_time = time.time()
index = 0
count = 0
action_list = []
BULK_COUNT = 1000 # 每BULK_COUNT个句子一起插入到ES中
for line in open(pie.music_file, 'r', encoding='utf-8'):
if not line:
continue
item = json.loads(line)
index += 1
action = {
"_index": pie._index,
"_type": pie.doc_type,
"_source": {
"question": item['question'],
"category": item['category'],
"answers": '\n'.join(item['answers']),
}
}
action_list.append(action)
if index > BULK_COUNT:
pie.insert_data_bulk(action_list=action_list)
index = 0
count += 1
print("bulk {} writted finished!".format(count))
action_list = []
end_time = time.time()
print("Time cost:{0}".format(end_time - start_time))
if __name__ == "__main__":
# 将知识库文件库插入到elasticsearch当中
init_ES()
博士僧小星
- 粉丝: 2417
- 资源: 5997
最新资源
- 基于VPI,Matlab的光通信仿真,数字信号处理
- 机械设计擀面皮自动生产机sw17可编辑非常好的设计图纸100%好用.zip
- 机械设计谷物分离机sw18可编辑非常好的设计图纸100%好用.zip
- 机械设计焊接旋转台step非常好的设计图纸100%好用.zip
- multisim四位密码锁电路仿真设计 功能: 1.通过拨码开关1进行初始密码设定 2.通过拨码开关2输入密码,实现开锁判断 3.如果密码正确,LED绿灯亮,表示开锁 4.如果密码不正确,LED
- 机械设计火腿肠自动切片生产线sw17非常好的设计图纸100%好用.zip
- 机械设计交剪式升降输送台(sw21可编辑+工程图)非常好的设计图纸100%好用.zip
- 光伏并网 MPPT追踪光伏最大发电功率 光伏boostmpptdc-ac电压电流双闭环 两级式三相光伏并网 双PI SPWM调制 Matlab Simlink仿真 三相L LC LCL并网逆变器
- DC-DC锂电池充电电源电路设计 包含锂电池充电电路,升压电路,电压均衡电路等电路组成
- 机械设计金属插头片自动化上料设备sw17可编辑非常好的设计图纸100%好用.zip
- jQuery文件上传(带进度条)基础版本,附带源码下载(HTML + PHP 实现文件上传-图片上传功能)
- 安卓模拟来电小软件 解决尴尬时刻 安装即用
- 机械设计铰链式传送线sw17可编辑非常好的设计图纸100%好用.zip
- 西门子变频器 SINAMICS STARTER V5.6 HF2 软件 STARTER V56 STARTERV56HF2-cd-2.zip.002
- 永磁同步电机全速域无传感器控制 1. 零低速域,采用高频脉振方波注入法, 2. 中高速域采用改进的滑膜观测器,开关函数采用的是连续的sigmoid函数,转子位置提取采用的是pll锁相环 3. 转速切区
- 计算机网络试卷1.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈