私有知识库 Coco AI 实战(三):摄入 Elasticsearch 官方文档

相信经常使用 Elasticsearch 的小伙伴,难免要到 ES 官网查找资料,文档内容多难以查找不说,还有很多个版本,加上各种生态工具如 Filebeat、Logstash 头就更大了。今天我来介绍如何使用 Coco AI 快速搜索 Elasticsearch 官方文档。在之前的文章中,我们介绍了如何将 MongoDB 数据摄入到Coco AI 中实现检索,感兴趣的小伙伴可以点这里查看。

在之前的文章中,我们介绍过通过爬虫程序爬取 Blog 数据写入 Easysearch 集群的方法,详情请戳这里。这次我们在原来的框架下,新建立一个 es-docs 爬虫,修改下原来的代码就行了。

建立新爬虫

复制代码
cd infini_spiders/spiders
scrapy genspider es-docs www.elastic.co

会创建新的 es-docs.py 文件。

Connector & Datasource

之前用 Coco AI 管理平台创建过 Connector 和 Datasource,这次我们直接放到爬虫程序中,通过 Easyearch 的 API 创建,不是 Coco AI 的 API 大家不要混淆了,以后有机会再介绍通过 Coco AI 的 API 创建。

程序开始,我们先检查 Easysearch 集群 coco_connector 索引中是否已经存在 doc_id 为 elasticsearch 的文档,如果不存在就创建相应的 Connector 和 Datasource。如果你之前通过管理平台创建了 elasticsearch 的 Connector 和 Datasource,就改下查询判断条件。

复制代码
import scrapy
from pprint import pprint
from elasticsearch import Elasticsearch
import sys


def doc_exists(index, doc_id):
    return es.exists(index=index, id=doc_id)


# 连接到Elasticsearch
with Elasticsearch("https://192.168.56.102:9200",
                   http_auth=('admin', '56939c1f6527d1a0d51c'),
                   use_ssl=True,
                   verify_certs=False,
                   ssl_show_warn=False) as es:

    # 检查连接是否成功
    if not es.ping():
        print("Elasticsearch连接失败!")
        sys.exit(1)
    else:
        print("Elasticsearch连接成功!")

    # 示例:检查 ID=elasticsearch 的文档是否存在
    if not (doc_exists("coco_connector", "elasticsearch")):
        connector = {
            'name': 'elasticsearch connector',
            'category': 'website',
            'icon': 'font_hugo-web'
        }
        pprint("创建 elasticsearch connector...")
        response = es.create(index='coco_connector',
                             body=connector,
                             id='elasticsearch')
        if response['result'] == 'created':
            print("创建成功")
        #pprint(response['_id'])

        datasource = {
            'name': 'elasticsearch datasource',
            'id': 'elasticsearch',
            'type': 'connector',
            'connector': {
                'id': 'elasticsearch',
            },
            'sync_enabled': False,
            'enabled': True
        }
        pprint("创建 elasticsearch datasource...")
        response = es.create(index='coco_datasource',
                             body=datasource,
                             id='elasticsearch')
        if response['result'] == 'created':
            print("创建成功")

Elasticsearch Docs

创建完 Connector 和 Datasource 后,我们就可以去爬取 Elasticsearch 官方文档了。通过变量 version 定义要爬取的版本,从 start_url 开始,把所有的页面的文本都提取回来,形成 Coco AI 需要的格式,写入 Easysearch。

复制代码
class EsDocsSpider(scrapy.Spider):
    name = "es-docs"
    allowed_domains = ["www.elastic.co"]
    version = "7.10"
    base_url = "https://www.elastic.co/guide/en/elasticsearch/reference/" + version + "/"
    start_urls = [base_url + "index.html"]

    tags = ["elastic-docs"]
    type_ = "elastic docs"
    category = "Elasticsearch-docs" + '_' + version

    def parse(self, response):
        chapter_links = response.css('span.chapter a::attr(href)').getall()
        yield from response.follow_all(chapter_links, self.parse_blog)

        section_links = response.css('span.section a::attr(href)').getall()
        yield from response.follow_all(section_links, self.parse_blog)

        part_links = response.css('span.part a::attr(href)').getall()
        return response.follow_all(part_links, self.parse_blog)

    def parse_blog(self, response):
        title = response.css('h1.title::text').get()
        url = response.url
        all_text = response.css(
            'h2::text,p:not([class]) ::text,li ::text').getall()

        text = ' '.join(all_text)
        content = text.replace('\n', '')

        yield {
            'title': title,
            'tags': self.tags,
            'url': url,
            'type': self.type_,
            'content': content,
            'source': {
                "type": "connector",
                "name": "Elasticsearch datasource",
                "id": "elasticsearch"
            },
            'category': self.category
        }

ScrapyElasticSearch

继续使用上次的插件把数据写入 Easysearch 集群。修改 scrapy 配置文件 settings.py

复制代码
ELASTICSEARCH_SERVERS = ['http://192.168.56.102:8000']
ELASTICSEARCH_INDEX = 'coco_document'
# ELASTICSEARCH_INDEX_DATE_FORMAT = '%Y-%m-%d'
ELASTICSEARCH_TYPE = '_doc'
ELASTICSEARCH_USERNAME = 'admin'
ELASTICSEARCH_PASSWORD = '56939c1f6527d1a0d51c'

修改对应的连接信息和 INDEX 名称,这里我使用 INFINI Gateway 代理 Easysearch。

搜索数据

我已经爬取了 7.10 和 8.17 的官方文档。

相关推荐
B博士7 小时前
科研进展 | JAG: 大光斑高光谱激光雷达遥感辐射传输模型从垂直视角解锁森林叶绿素分布密码
人工智能·jag·高光谱激光雷达·森林分层叶绿素诊断
Yao.Li8 小时前
PVN3D ORT CUDA Custom Ops 实现与联调记录
人工智能·3d·具身智能
诺伦8 小时前
LocalClaw 在智能制造的新机会:6部门AI+电商政策下的工厂AI升级方案
人工智能·制造
小陈工10 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
A__tao14 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
墨染天姬14 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志15 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_9481142415 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠15 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光15 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生