该项目是用 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