GEO AI搜索引擎优化系统——官方媒体接入功能开发与源码搭建

(平台提示:本文可能是商业推广软文,请注意分辨)

科技风教育课程倒计时公众号首图 (2)_副本

一、功能概述

GEO AI搜索引擎是一款基于大模型的智能语义检索系统,区别于传统关键词搜索引擎,具备语义理解、内容权重智能排序、垃圾信息过滤、权威内容优先展示等核心能力。

本次**媒体接入功能开发,旨在为GEO搜索系统接入主流权威**媒体数据源,实现媒体内容实时抓取、合规校验、权重置顶、权威标识展示、内容结构化入库五大核心能力。解决普通搜索引擎自媒体、劣质内容泛滥、权威信息滞后、信息真伪难辨的痛点,大幅提升GEO AI搜索结果的权威性、准确性和时效性。
电商小程序商城新人活动海报banner (3)

核心功能亮点

  • 支持主流**媒体源批量接入(央视、新华网、人民网等)

  • AI 内容合规校验、去重、降噪处理

  • 权威媒体内容搜索权重自动上浮、置顶展示

  • 媒体来源标识、**认证标签前端渲染

  • 定时增量爬取、故障重试、日志监控体系
    电商小程序商城新人活动海报banner (5)

二、系统开发环境与技术栈

本次**媒体接入功能基于GEO原有AI搜索架构开发,技术栈适配主流后端AI搜索开发场景,兼容性强、部署简单:

  • 后端语言:Python 3.9+

  • AI语义解析:Transformers、Sentence-BERT

  • 数据存储:MySQL 8.0(媒体数据源配置)、Elasticsearch 7.14(搜索索引存储)

  • 爬虫框架:Requests、BeautifulSoup、APScheduler(定时任务)

  • 接口服务:FastAPI(高性能接口,适配AI搜索响应)

  • 部署环境:Linux CentOS 7+、Docker(可选)

三、整体架构设计

**媒体接入功能采用分层架构,与GEO AI搜索引擎原生架构无缝对接,分为四层:

  1. 数据源配置层:统一管理所有**媒体域名、接口、权重等级、状态开关

  2. 数据采集层:定时爬虫批量抓取媒体资讯、图文内容,过滤无效数据

  3. AI处理层:语义向量化、内容合规检测、权威权重赋值、去重降噪

  4. 检索服务层:整合原有搜索接口,优先展示**媒体内容,返回带认证标签的搜索结果

四、数据库表结构设计(媒体配置表)

新增GEO**媒体数据源配置表,用于统一管理所有接入的**媒体渠道,SQL源码如下:

CREATE TABLE `geo_media_source` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `media_name` varchar(100) NOT NULL COMMENT '媒体名称',
  `media_domain` varchar(255) NOT NULL COMMENT '媒体**域名',
  `media_type` tinyint(1) DEFAULT 1 COMMENT '媒体类型:1=国家级**媒体 2=省级**媒体 3=权威资讯平台',
  `weight` int(11) DEFAULT 90 COMMENT '搜索权重(0-100,越高越优先)',
  `status` tinyint(1) DEFAULT 1 COMMENT '状态:0=禁用 1=启用',
  `crawl_interval` int(11) DEFAULT 30 COMMENT '爬取间隔(分钟)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_domain` (`media_domain`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='GEO AI搜索-**媒体接入配置表';

五、核心功能源码实现

5.1 项目依赖安装

搭建环境前安装所需依赖包,适配媒体采集、AI处理、接口服务:

pip install fastapi uvicorn requests beautifulsoup4 transformers sentence-transformers elasticsearch apscheduler pymysql python-dotenv

5.2 媒体数据源配置加载模块

读取数据库**媒体配置,批量加载可用数据源,为爬虫采集提供配置支撑:

# geo_media_config.py 媒体配置核心模块
import pymysql
from dotenv import load_dotenv
import os

load_dotenv()

# 数据库连接配置
DB_CONFIG = {
    "host": os.getenv("DB_HOST", "127.0.0.1"),
    "user": os.getenv("DB_USER", "root"),
    "password": os.getenv("DB_PWD", "123456"),
    "database": os.getenv("DB_NAME", "geo_search"),
    "charset": "utf8mb4"
}

def get_enable_media_source():
    """
    获取所有启用的**媒体数据源
    :return: 媒体配置列表
    """
    try:
        conn = pymysql.connect(**DB_CONFIG)
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = """
        SELECT media_name, media_domain, media_type, weight, crawl_interval 
        FROM geo_media_source WHERE status = 1
        """
        cursor.execute(sql)
        media_list = cursor.fetchall()
        return media_list
    except Exception as e:
        print(f"媒体数据源加载失败:{str(e)}")
        return []
    finally:
        cursor.close()
        conn.close()

# 全局加载媒体数据源
MEDIA_SOURCE_LIST = get_enable_media_source()

5.3 **媒体数据采集模块

实现定时增量爬取、页面解析、原始数据清洗,适配主流**媒体页面结构:

# geo_media_crawl.py 媒体采集模块
import requests
from bs4 import BeautifulSoup
import time
from apscheduler.schedulers.background import BackgroundScheduler
from geo_media_config import MEDIA_SOURCE_LIST
from geo_es_utils import es_save_media_data

# 请求头伪装浏览器
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

def crawl_media_news(media_info):
    """
    单媒体源数据爬取
    :param media_info: 媒体配置信息
    :return: None
    """
    try:
        domain = media_info.get("media_domain")
        media_name = media_info.get("media_name")
        weight = media_info.get("weight")

        res = requests.get(domain, headers=HEADERS, timeout=10)
        res.encoding = "utf-8"
        soup = BeautifulSoup(res.text, "html.parser")

        # 通用新闻列表解析(适配官媒资讯列表)
        news_items = soup.select("ul.list li, .news-list .item")
        save_list = []

        for item in news_items[:20]:  # 单次最多采集20条增量数据
            title = item.get_text(strip=True)
            link = item.find("a")["href"] if item.find("a") else ""
            if not title or not link:
                continue
            
            # 补全绝对链接
            if not link.startswith("http"):
                link = domain.rstrip("/") + link

            save_list.append({
                "title": title,
                "url": link,
                "media_name": media_name,
                "media_domain": domain,
                "weight": weight,
                "crawl_time": int(time.time())
            })
        
        # 存入ES搜索索引
        if save_list:
            es_save_media_data(save_list)
            print(f"【{media_name}】采集成功,新增数据:{len(save_list)}条")

    except Exception as e:
        print(f"【{media_info.get('media_name')}】采集失败:{str(e)}")

def start_media_crawl_task():
    """启动全局媒体定时采集任务"""
    scheduler = BackgroundScheduler(timezone="Asia/Shanghai")
    for media in MEDIA_SOURCE_LIST:
        interval = media.get("crawl_interval", 30)
        # 按配置间隔定时爬取
        scheduler.add_job(
            crawl_media_news,
            "interval",
            minutes=interval,
            args=[media]
        )
    scheduler.start()
    print("GEO**媒体采集定时任务启动成功!")

if __name__ == "__main__":
    start_media_crawl_task()

5.4 AI权重优化与内容校验模块

基于Sentence-BERT实现内容向量化,结合**媒体权重做搜索排序优化,同时过滤违规、低质内容:

# geo_media_ai.py AI权重优化模块
from sentence_transformers import SentenceTransformer
import numpy as np

# 加载轻量语义模型(适配搜索场景)
model = SentenceTransformer("all-MiniLM-L6-v2")

# **媒体权重加成系数
MEDIA_WEIGHT_RATIO = 1.8

def content_semantic_score(query, content_title):
    """
    计算搜索词与媒体内容的语义相似度分数
    """
    query_emb = model.encode(query)
    title_emb = model.encode(content_title)
    # 余弦相似度计算
    cos_score = np.dot(query_emb, title_emb) / (np.linalg.norm(query_emb) * np.linalg.norm(title_emb))
    return round(float(cos_score), 4)

def media_search_rank(query, result_list):
    """
    媒体搜索结果权重重排
    **媒体内容加权上浮,劣质内容降权
    """
    rank_result = []
    for item in result_list:
        # 基础语义分数
        base_score = content_semantic_score(query, item["title"])
        # **媒体权重加成
        if item.get("media_name"):
            final_score = base_score * MEDIA_WEIGHT_RATIO * (item["weight"] / 100)
        else:
            final_score = base_score * 0.7  # 非**内容降权
        
        item["final_score"] = final_score
        item["is_official"] = 1 if item.get("media_name") else 0
        rank_result.append(item)
    
    # 按最终分数倒序排序
    rank_result.sort(key=lambda x: x["final_score"], reverse=True)
    return rank_result

def content_verify(content):
    """简单AI内容合规校验"""
    illegal_words = ["低俗", "违规", "诈骗"]
    for word in illegal_words:
        if word in content:
            return False
    return True

5.5 Elasticsearch存储工具模块

实现媒体数据结构化入库、索引创建,适配GEO搜索检索逻辑:

# geo_es_utils.py ES存储工具
from elasticsearch import Elasticsearch
import os

es = Elasticsearch(
    host=os.getenv("ES_HOST", "127.0.0.1"),
    port=os.getenv("ES_PORT", 9200)
)

# 媒体搜索索引名
MEDIA_INDEX = "geo_official_media"

def create_media_index():
    """创建媒体索引(不存在则创建)"""
    if not es.indices.exists(index=MEDIA_INDEX):
        mapping = {
            "mappings": {
                "properties": {
                    "title": {"type": "text", "analyzer": "ik_max_word"},
                    "url": {"type": "keyword"},
                    "media_name": {"type": "keyword"},
                    "media_domain": {"type": "keyword"},
                    "weight": {"type": "integer"},
                    "crawl_time": {"type": "long"},
                    "is_official": {"type": "integer"}
                }
            }
        }
        es.indices.create(index=MEDIA_INDEX, body=mapping)

def es_save_media_data(data_list):
    """批量存入媒体数据"""
    create_media_index()
    for data in data_list:
        es.index(index=MEDIA_INDEX, body=data)

5.6 核心搜索接口整合模块

对接GEO原生搜索接口,接入**媒体权重排序,返回带**标识的搜索结果:

# geo_search_api.py 搜索接口服务
from fastapi import FastAPI
from geo_media_ai import media_search_rank
from geo_es_utils import es, MEDIA_INDEX

app = FastAPI(title="GEO AI搜索-**媒体接入接口")

@app.get("/api/geo/search")
def geo_ai_search(query: str, page: int = 1, size: int = 10):
    """
    GEO AI搜索核心接口(整合**媒体权重优化)
    """
    # 1. ES检索媒体数据+通用数据
    body = {
        "query": {
            "multi_match": {
                "query": query,
                "fields": ["title"]
            }
        },
        "from": (page - 1) * size,
        "size": size
    }
    res = es.search(index=MEDIA_INDEX, body=body)
    hit_list = [hit["_source"] for hit in res["hits"]["hits"]]

    # 2. AI权重重排优化
    final_result = media_search_rank(query, hit_list)

    # 3. 格式化返回结果
    return {
        "code": 200,
        "msg": "搜索成功",
        "data": {
            "total": res["hits"]["total"]["value"],
            "list": final_result
        }
    }

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

六、功能部署与启动流程

  1. 环境准备:安装Python依赖、启动MySQL、Elasticsearch服务;

  2. 数据库初始化:执行上方媒体配置表SQL,插入**媒体数据源(新华网、人民网、央视网等);

  3. 配置环境变量:新建.env文件,配置数据库、ES连接地址;

  4. 启动采集任务:运行geo_media_crawl.py,开启定时媒体数据采集;

  5. 启动搜索服务:运行geo_search_api.py,启动GEO优化搜索接口;

  6. 接口测试:访问 http://localhost:8000/api/geo/search?query=关键词 验证功能。

七、功能优化与扩展方向

  • 多源适配:针对不同官媒定制专属解析规则,提升数据采集精度;

  • 大模型摘要:接入大模型对媒体内容进行智能摘要,优化搜索展示效果;

  • 实时热词推送:监控官媒热点资讯,实现搜索热词自动更新;

  • 权限后台:开发可视化后台,支持媒体源新增、权重修改、任务启停管理;

  • 缓存优化:新增Redis缓存高频搜索**媒体结果,大幅提升响应速度。

八、源码总结

本次开发的GEO AI搜索引擎**媒体接入功能,完整实现了媒体源配置、自动化采集、AI智能校验、权重优化排序、接口服务输出全链路能力。源码轻量化、模块化,可直接嵌入现有GEO搜索系统,无需大幅改动原生架构。通过**媒体权重加成机制,从根源上解决AI搜索权威信息优先级不足的问题,显著提升搜索引擎的专业性和实用性。

posted @ 2026-08-13 14:35  兔兔不是荼荼  阅读(5)  评论(0)    收藏  举报