你想要开发一个面向 GEO(搜索)优化排名的系统,核心是实现 "内容式生成" 的搜索引擎逻辑,简单来说就是让搜索引擎能基于AI大模型和内容特征数据,智能生成并排序符合用户地理场景的搜索结果。

一、核心开发思路
先明确这个搜索引擎的核心逻辑框架,主要分为 5 个核心模块,形成 "数据采集→特征提取→索引构建→智能生成→排序优化" 的完整链路:
- 地理 + 内容数据采集:获取带地理标签的内容(如商户信息、本地资讯、用户 UGC);
- 多维度特征提取:拆分地理特征(经纬度、商圈、距离)和内容特征(关键词、语义、用户偏好);
- GEO + 内容双索引构建:让系统能快速检索 "地理范围 + 内容关键词" 的匹配结果;
- 内容式生成逻辑:基于检索结果,结合地理场景(如 "附近 3 公里的咖啡店")智能生成贴合需求的内容(如补充商户特色、距离、评分);
- GEO 优化排名算法:融合地理权重、内容相关性、用户行为,输出最优排序结果。
二、完整代码实现(Python 示例)
以下是可落地的核心逻辑代码,基于轻量级框架实现,包含数据模型、索引、生成、排序全流程:
python
运行
import math
import jieba
from collections import defaultdict
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# ===================== 1. 数据模型定义 =====================
class GeoContentItem:
"""地理内容数据模型:存储带地理标签的内容信息"""
def __init__(self, item_id, title, content, lng, lat, category, score=0.0):
self.item_id = item_id # 内容ID
self.title = title # 标题
self.content = content # 正文内容
self.lng = lng # 经度
self.lat = lat # 纬度
self.category = category # 内容分类(如餐饮、酒店)
self.score = score # 初始评分
# ===================== 2. 地理工具函数 =====================
def haversine_distance(lng1, lat1, lng2, lat2):
"""
计算两点间的球面距离(哈维正弦公式),返回单位:米
:param lng1/lat1: 目标点经纬度
:param lng2/lat2: 内容点经纬度
"""
R = 6371000 # 地球半径(米)
lng1, lat1, lng2, lat2 = map(math.radians, [lng1, lat1, lng2, lat2])
dlng = lng2 - lng1
dlat = lat2 - lat1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlng/2)**2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
distance = R * c
return distance
# ===================== 3. 索引构建模块 =====================
class GeoContentIndex:
"""地理+内容双索引:快速检索地理范围+内容匹配的结果"""
def __init__(self):
self.geo_index = defaultdict(list) # 地理索引:{商圈: [内容ID列表]}
self.content_index = {} # 内容索引:{内容ID: GeoContentItem对象}
self.tfidf = TfidfVectorizer() # TF-IDF用于内容语义匹配
def add_item(self, item):
"""添加内容到索引"""
# 简化:按经纬度划分商圈(实际可对接高德/百度地图的商圈接口)
business_circle = f"{int(item.lng*10)}_{int(item.lat*10)}"
self.geo_index[business_circle].append(item.item_id)
self.content_index[item.item_id] = item
def build_content_vector(self, all_contents):
"""构建内容的TF-IDF向量(用于语义匹配)"""
self.tfidf_matrix = self.tfidf.fit_transform(all_contents)
def search_geo_range(self, target_lng, target_lat, max_distance=5000):
"""检索目标位置max_distance米内的所有内容"""
nearby_items = []
for item_id, item in self.content_index.items():
distance = haversine_distance(target_lng, target_lat, item.lng, item.lat)
if distance <= max_distance:
nearby_items.append((item, distance))
return nearby_items
# ===================== 4. 内容式生成+排序核心逻辑 =====================
class GeoSearchEngine:
"""GEO优化的内容生成式搜索引擎"""
def __init__(self, index):
self.index = index # 关联地理内容索引
# 排名权重配置(可根据业务调优)
self.weights = {
"distance": 0.4, # 距离权重
"content_sim": 0.3, # 内容相关性权重
"item_score": 0.3 # 内容本身评分权重
}
def calculate_content_similarity(self, query, item):
"""计算查询词与内容的语义相似度"""
query_vec = self.index.tfidf.transform([query])
item_vec = self.index.tfidf.transform([item.title + " " + item.content])
return cosine_similarity(query_vec, item_vec)[0][0]
def generate_ranked_results(self, query, target_lng, target_lat, max_distance=5000):
"""
核心功能:生成并排序符合地理+内容需求的搜索结果
:param query: 用户搜索词(如"附近的咖啡店")
:param target_lng/target_lat: 用户当前经纬度
:param max_distance: 地理检索范围(米)
:return: 排序后的结果(含生成的内容描述)
"""
# 步骤1:检索地理范围内的内容
nearby_items = self.index.search_geo_range(target_lng, target_lat, max_distance)
if not nearby_items:
return ["未找到符合条件的内容"]
# 步骤2:计算每个内容的综合得分
scored_items = []
for item, distance in nearby_items:
# 距离得分:距离越近得分越高(归一化到0-1)
distance_score = 1 - (distance / max_distance) if max_distance > 0 else 1
# 内容相似度得分
content_sim_score = self.calculate_content_similarity(query, item)
# 内容本身评分(归一化到0-1)
item_score = min(item.score / 5.0, 1.0) # 假设评分是0-5分
# 综合得分
total_score = (
distance_score * self.weights["distance"] +
content_sim_score * self.weights["content_sim"] +
item_score * self.weights["item_score"]
)
scored_items.append((item, distance, total_score))
# 步骤3:按综合得分降序排序
scored_items.sort(key=lambda x: x[2], reverse=True)
# 步骤4:内容式生成结果描述(贴合地理场景)
generated_results = []
for idx, (item, distance, score) in enumerate(scored_items[:10]): # 取前10条
distance_km = round(distance / 1000, 1)
# 生成个性化描述(可扩展:结合用户偏好、时段等)
result_desc = f"【{idx+1}】{item.title}({item.category})- 距离您{distance_km}公里,评分:{item.score:.1f}分。简介:{item.content[:50]}..."
generated_results.append({
"item_id": item.item_id,
"rank": idx+1,
"score": round(score, 3),
"generated_content": result_desc
})
return generated_results
# ===================== 5. 测试用例 =====================
if __name__ == "__main__":
# 步骤1:初始化索引
geo_index = GeoContentIndex()
# 步骤2:模拟添加测试数据(实际可对接数据库/爬虫)
test_items = [
GeoContentItem(1, "星巴克(中关村店)", "美式咖啡口感醇厚,环境舒适,有充电插座", 116.3108, 39.9975, "餐饮", 4.8),
GeoContentItem(2, "瑞幸咖啡(海淀黄庄店)", "生椰拿铁爆款,性价比高,取餐快", 116.3225, 39.9888, "餐饮", 4.5),
GeoContentItem(3, "漫咖啡(五道口店)", "拿铁搭配甜点,适合办公,空间大", 116.3387, 40.0056, "餐饮", 4.7),
GeoContentItem(4, "麦当劳(中关村店)", "快餐为主,咖啡偏淡,24小时营业", 116.3092, 39.9968, "餐饮", 4.2),
]
for item in test_items:
geo_index.add_item(item)
# 步骤3:构建内容TF-IDF向量
all_contents = [item.title + " " + item.content for item in test_items]
geo_index.build_content_vector(all_contents)
# 步骤4:初始化搜索引擎
search_engine = GeoSearchEngine(geo_index)
# 步骤5:模拟用户搜索(用户位置:中关村,搜索词:"咖啡店")
user_lng, user_lat = 116.3110, 39.9980 # 中关村经纬度
query = "咖啡店"
results = search_engine.generate_ranked_results(query, user_lng, user_lat, max_distance=3000)
# 步骤6:输出结果
print("GEO优化排名结果:")
for res in results:
print(f"排名{res['rank']}(得分{res['score']}):{res['generated_content']}")
三、代码关键模块解释
- 地理距离计算 :
haversine_distance函数用球面距离公式精准计算两点间实际距离,是 GEO 排名的核心基础; - 双索引设计 :
GeoContentIndex同时维护地理索引(快速定位附近内容)和内容索引(存储完整信息),兼顾检索效率和内容匹配; - 内容相似度:基于 TF-IDF + 余弦相似度,实现搜索词与内容的语义匹配,而非简单的关键词匹配;
- 加权排名算法:融合 "距离、内容相关性、内容质量" 三大维度,权重可根据业务场景(如本地生活、旅游)灵活调整;
- 内容式生成:排序后自动生成贴合地理场景的结果描述(含距离、评分、简介),而非单纯罗列信息。
四、运行前置条件
- 安装依赖:
bash
运行
pip install scikit-learn jieba
- 若需更精准的地理数据(如商圈、行政区划),可对接高德 / 百度地图的 API,替换示例中简化的商圈划分逻辑;
- 实际应用中,需将索引模块替换为 Redis/Elasticsearch(ES 内置 GEO 检索功能,更适合生产环境)。
总结
- GEO 优化排名的核心是地理特征 + 内容特征的融合:既要精准匹配用户地理范围,也要保证内容相关性;
- 内容式生成的关键是基于检索结果,结合地理场景(距离、位置)生成个性化、有价值的描述,而非简单罗列;
- 排名算法需动态调优权重:比如本地生活场景可提高 "距离权重",旅游场景可提高 "内容评分权重"。