【IPFS相关】使用Lens运行「你自己的IPFS搜索引擎」
本文由IPFS原力区收集译制,版权所属原作者
Lens是我们Temporal umbrella下的另一个开源IPFS工具,它允许你从IPFS中提取内容,并将其编入索引,以便日后搜索。目前Lens可以索引以下mime类型:
-
文本/*
-
图像/*
-
应用程序/ pdf
唯一个的要求是所有数据都存在于IPFS上,并且可以由正在运行的Lens实例发现。在未来,我们可能会增加对其他分布式网络的支持,如DAT或SWARM。为了与Lens交互,我们有一个简单但健壮的gRPC API,它支持简单和复杂的查询。
索引是如何工作的
我们有几种不同的分析数据的方法,我们将把它们串联起来。当索引pdf文件时,我们首先尝试从页面中提取图像和文本。文本被输入bleve,它能够处理简单和复杂的搜索查询。同时,结合用于光学字符识别的Tesseract和用于图像初步分类的Tensorflow,对图像进行了分析。在分析其他mime类型(如image/*)时,我们尝试执行与从pdf中提取的图像相同的Tesseract和图像分类分析。当分析像text/*这样的mime类型时,我们直接将文本输入bleve。
搜索是如何工作的
在最基本的级别上进行搜索包括接受查询,范围从单个单词(如区块链)一直到搜索短语(如区块链数据存储)。我们还支持更复杂的查询,比如针对特定标记、类别、mime类型进行过滤,等等,这些都是完全可选的。
对查询的响应是一个文档数组,其中包含匹配查询的内容的IPFS散列,及内容的mimetype,以及显示该内容与搜索查询相关性的分数。
安装Lens
有几种不同的方法可以安装镜头,其中最简单的方法是使用我们预先构建的Lens docker映像。使用docker映像时,默认设置是启动gRPC服务器监听0.0.0.0:9998,不进行任何加密,并使用blahblahblah的gRPC身份验证密钥。docker容器还需要到IPFS HTTP API的连接,缺省值为127.0.0.1:5001。要安装这个docker映像,运行以下命令docker pull rtradetech/lens:latest
另外,对于更多的那些想要手动设置的人,我们有一个docker-compose设置,它还可以转换所需的IPFS节点。要使用这个docker-compose文件,需要运行以下命令集。它们将使用/tmp目录作为存储所有文件的基本目录。
$> wget -O lens.yml https://raw.githubusercontent.com/RTradeLtd/Lens/master/lens.yml
$> LENS=latest BASE=/tmp docker-compose -f lens.yml up
用Lens
在开始介绍如何使用Lens之前,我们已经发布了现有的Lens索引,https://temporal.cloud/lens
通过IPFS可以通过CID QmZqSYDQrtWg4LHnqT6DPqa1XUr7u4oeaGcyaTiGHJY3SR下载。它的大小为1.2GB,包含各种研究论文、加密白皮书和我提交的文档,以及其他用户提交的文档。
所有索引和搜索都可以通过gRPC API完成,为此我们在github上发布了协议缓冲区。使用这些,您可以为Lens构建支持协议缓冲区的任何语言的API !
关于我们如何使用这些协议缓冲区来构建临时的Lens API客户端,您可以查看我们下面的Golang示例:
package clients
import (
"fmt"
"github.com/RTradeLtd/config/v2"
"github.com/RTradeLtd/grpc/dialer"
pb "github.com/RTradeLtd/grpc/lensv2"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
const (
defaultURL = "127.0.0.1:9998"
)
// LensClient is a lens client used to make requests to the Lens gRPC server
type LensClient struct {
conn *grpc.ClientConn
pb.LensV2Client
}
// NewLensClient is used to generate our lens client
func NewLensClient(opts config.Services) (*LensClient, error) {
dialOpts := make([]grpc.DialOption, 0)
if opts.Lens.TLS.CertPath != "" {
creds, err := credentials.NewClientTLSFromFile(opts.Lens.TLS.CertPath, "")
if err != nil {
return nil, fmt.Errorf("could not load tls cert: %s", err)
}
dialOpts = append(dialOpts,
grpc.WithTransportCredentials(creds),
grpc.WithPerRPCCredentials(dialer.NewCredentials(opts.Lens.AuthKey, true)))
} else {
dialOpts = append(dialOpts,
grpc.WithInsecure(),
grpc.WithPerRPCCredentials(dialer.NewCredentials(opts.Lens.AuthKey, false)))
}
var url string
if opts.Lens.URL == "" {
url = defaultURL
} else {
url = opts.Lens.URL
}
conn, err := grpc.Dial(url, dialOpts...)
if err != nil {
return nil, err
}
return &LensClient{
conn: conn,
LensV2Client: pb.NewLensV2Client(conn),
}, nil
}
// Close shuts down the client's gRPC connection
func (l *LensClient) Close() { l.conn.Close() }
要实际索引数据,一旦你的gRPC客户机启动并运行,你所需要做的就是调用index命令,并让Lens发挥它的魔力!根据内容在网络中的位置,这个过程可能会花费一些时间。一般来说,如果内容是本地可用的,那么索引分析不会花费超过一分钟,通常是30秒。在为索引提交数据时,必须提供两个参数ObjectType,它应该使用协议缓冲区中定义的IndexReq_IPLDas。第二个参数是ObjectIdentifier,它应该是你希望索引的内容的IPFS散列。
搜索数据也非常简单,需要调用Search命令。唯一需要的参数是Query,它定义了如何搜索数据。你还可以选择性地过滤出你的搜索结果,甚至更多的过滤器,如哈希表只匹配特定的IPFS哈希表,MimeTypes只匹配特定的mime类型。完成此命令所需的时间取决于多种因素,比如索引的大小、匹配对象的数量、索引所在磁盘的速度。
感谢你,并向所有为IPFS做出贡献的人以及许多不同项目所做的所有伟大工作欢呼!
作者:RTrade
本文由IPFS中国社区编译,原文链接:https://medium.com/@rtradetech/run-your-own-ipfs-search-engine-with-lens-c262fd9e5cc

IPFS原力区
Slogan:让存储更安全、更高效、更开放、更经济
价值观:价值 共建 共享 荣耀
总部位于上海,聚集基于分布式网络&存储的众多技术大咖和爱好者,深耕基于 IPFS 的商业生态建设和社区发展。
每周二举办“分布式存储网络”主题沙龙,聚集了众多技术大咖和 IPFS 爱好者,通过持续输出全面、精细、优质的 IPFS 咨询和技术支持,将生态中的爱好者转化为 IPFS支持者和参与者,共建 IPFS 生态的健康发展。

阅读原文,周二活动快速了解