C++ 编写的即时搜索引擎,赶紧收藏起来~

项目是用 C++ 编写的即时搜索引擎,具有开箱即用、搜索速度快、自动更正拼写错误、地理搜索、默认分词器支持中文等特点。C++ 编写的即时搜索引擎,赶紧收藏起来~

特点

  • 打字错误容错:优雅地处理打字错误,开箱即用。
  • 简单而令人愉快:设置、集成、操作和扩展都很简单。
  • 速度极快:用 C++ 构建。从头开始精心设计,可实现低延迟(<50ms)即时搜索。
  • 可调排名:轻松定制搜索结果以达到完美。
  • 排序:在查询时根据特定字段动态对结果进行排序(对于“按价格排序 (asc)”等功能很有帮助)。
  • 分面和过滤:深入研究并细化结果。
  • 分组和不同:将相似的结果分组在一起以显示更多的多样性。
  • 联合搜索:在单个 HTTP 请求中跨多个集合(索引)进行搜索。
  • 地理搜索:按纬度/经度周围或边界框内的结果进行搜索和排序。
  • 范围 API 密钥:为多租户应用程序生成仅允许访问某些记录的 API 密钥。
  • 同义词:将单词定义为彼此等效的单词,因此搜索单词也会返回定义的同义词的结果。
  • 基于 Raft 的集群:设置高可用的分布式集群。
  • 无缝版本升级:随着 Typesense 新版本的出现,升级就像换出二进制文件并重新启动 Typesense 一样简单。
  • 无运行时依赖性:Typesense 是一个二进制文件,可以使用单个命令在本地或生产环境中运行。

增强功能

  • 使用通配符解析字段名称:现在可以在 facetby, query_by, include_fields, exclude_fields, 中解析字段 highlight_fields,并且 highlight_full_fields 当使用通配符表达式时,例如 title*将匹配 title_en。
  • 即使命中通过 截断,也会返回每个组下的记录总数 group_limit。
  • !=现在可以针对数字字段执行过滤操作。以前此运算符仅支持字符串字段。
  • preset 支持在嵌入式 API 密钥中使用参数。
  • 支持嵌套动态字段。
  • 将构建系统迁移到 Bazel。

配置服务器

使用配置文件

可以通过配置文件或环境变量来配置 Typesense 服务器。命令行参数的优先级最高,而环境变量的优先级最低。

./typesense-server --config=/etc/typesense/typesense-server.ini

Linux DEB/RPM 软件包将配置文件安装在/etc/typesense/typesense-server.ini. 配置文件使用简单的 INI 格式:

; /etc/typesense/typesense-server.ini

[server]

api-key = Rhsdhas2asasdasj2
data-dir = /var/lib/typesense
log-dir = /var/log/typesense
api-port = 9090

使用环境变量

如果想使用环境变量,也可以这样做。环境变量映射到上面记录的命令行参数:只需使用大写字母和下划线而不是连字符,并在变量名称前面加上 TYPESENSE_. 例如,用于 TYPESENSE_DATA_DIR 参数–data-dir。

TYPESENSE_DATA_DIR=/var/lib/typesense TYPESENSE_API_KEY=AS3das2awQ2 ./typesense-server

API 资源

地理搜索

Typesense 支持对包含纬度和经度值的字段进行地理搜索,指定为 geopoint 或 geopoint[] 字段类型。创建一个名为 的集合,其中包含一个名为类型的 places 字段。locationgeopoint

CollectionSchema collectionSchema = new CollectionSchema();

collectionschema.name("places")
                .addFieldsItem(new Field().name("title").type("string"))
                .addFieldsItem(new Field().name("points").type("int32"))
                .addFieldsItem(new Field().name("location").type("geopoint"))
                .defaultSortingField("points");

CollectionResponse collectionResponse = client.collections().create(collectionSchema);

索引一个文档

HaashMap<String, Object> document = new HashMap<>();
float[] location =  {48.86093481609114, 2.33698396872901}

document.add("title""Louvre Museuem");
document.add("points", 1);
document.add("location", location);

client.collection("places").documents.create(document);

按半径内的附加属性排序

「排除半径」有时,根据另一个属性(例如 )对半径内的附近位置进行排序 popularity,然后按该半径之外的距离进行排序是很有用的。可以使用 exclude_radius 该选项。

'sort_by' : 'location(48.853, 2.344, exclude_radius: 2mi):asc, popularity:desc'

这使得 2 英里半径内的所有文档都以相同的距离值“绑定”。为了打破平局,这些记录将按列表中的下一个字段进行排序 popularity:desc。2 英里半径之外的记录首先按距离排序,然后 popularity:desc 照常排序。

「精确」同样可以使用该 precision 参数将所有地理点分入“组”,以便该组内的所有结果都将具有相同的“地理距离分数”。

'sort_by' : 'location(48.853, 2.344, precision: 2mi):asc, popularity:desc'

这会将结果分成 2 英里的组,并强制每个桶内的记录与“地理分数”打成平局,以便流行度指标可用于对每个桶内的结果进行平局和排序。

传送门

开源协议:GPL-3.0 license

开源地址:https://github.com/typesense/typesense

-END-


原文始发于微信公众号(开源技术专栏):C++ 编写的即时搜索引擎,赶紧收藏起来~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/166514.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!