演示仓库地址:https://j.blaszyk.me/tech-blog/mcp-server-elasticsearch-semantic-search/
此仓库提供了一个通过Elasticsearch索引的Search Labs博客文章进行语义搜索的Python实现的MCP服务器。
假设您已经爬取了博客文章,并使用Elastic Open Crawler将其存储在search-labs-posts索引中。
在.env文件中添加ES_URL和ES_AP_KEY,(参见此处生成具有最小权限的API密钥)
在MCP Inspector中启动服务器:
make dev
一旦运行,可以通过访问以下地址来访问MCP Inspector:http://localhost:5173
要将MCP服务器添加到Claude Desktop:
make install-claude-config
这会更新您主目录中的claude_desktop_config.json。在下一次重启时,Claude应用程序将检测到服务器并加载声明的工具。
要检查Elastic Open Crawler是否正常工作,请运行:
docker run --rm \
--entrypoint /bin/bash \
-v "$(pwd)/crawler-config:/app/config" \
--network host \
docker.elastic.co/integrations/crawler:latest \
-c "bin/crawler crawl config/test-crawler.yml"
这应该打印出从单个页面爬取的内容。
设置Elasticsearch URL和API密钥。
生成一个具有最小爬虫权限的API密钥:
POST /_security/api_key
{
"name": "crawler-search-labs",
"role_descriptors": {
"crawler-search-labs-role": {
"cluster": ["monitor"],
"indices": [
{
"names": ["search-labs-posts"],
"privileges": ["all"]
}
]
}
},
"metadata": {
"application": "crawler"
}
}
从响应中复制encoded值,并将其设置为API_KEY。
确保search-labs-posts索引存在。如果不存在,请创建它:
PUT search-labs-posts
更新映射以启用语义搜索:
PUT search-labs-posts/_mappings
{
"properties": {
"body": {
"type": "text",
"copy_to": "semantic_body"
},
"semantic_body": {
"type": "semantic_text",
"inference_id": ".elser-2-elasticsearch"
}
}
}
body字段作为语义文本使用Elasticsearch的ELSER模型进行索引。
运行爬虫以填充索引:
docker run --rm \
--entrypoint /bin/bash \
-v "$(pwd)/crawler-config:/app/config" \
--network host \
docker.elastic.co/integrations/crawler:latest \
-c "bin/crawler crawl config/elastic-search-labs-crawler.yml"
[!TIP] 如果使用的是新的Elasticsearch集群,请在索引之前等待ELSER模型启动。
检查文档是否已被索引:
GET search-labs-posts/_count
这将返回索引中的总文档数。您也可以在Kibana中进行验证。
完成!现在您可以对Search Labs博客文章执行语义搜索。