lucene 用于查询和排序的多字段与字段数据

0md85ypi  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(213)

我使用Elasticsearch 6创建了一个简单的“person”数据库,基本上如下所示:

id | firstName | lastName
-------------------------
1  | Tim       | Berners-Lee
2  | Linus     | Torvalds
3  | Noam      | Chomsky

我想按lastName(和/或按firstName-取决于用户输入)进行查询和排序。
现在我找到了两个解决方案,看起来很有效,但我不确定哪一个是“正确的”(或“更好的”),为什么:
1.多字段:"type": "text", "fields": { "raw": { "type": "keyword" } }:我可以使用lastName进行查询,使用lastName.raw进行排序。
1.字段数据:"type": "text", "fielddata": true:这里我可以使用lastName进行查询和排序。
但我完全不确定为什么我应该选择其中一个,以及这个选择有什么含义。

puruo6ea

puruo6ea1#

希望以下几点能帮助您根据实际使用情形做出决定。
1.多个字段
它的目的-用不同的分析器存储单个字段。因为您已经使用了textkeyword
它没有任何特殊的缓存。
1.字段数据
它的用途-在聚合/排序过程中更快地访问。它将所有数据加载到字段缓存中。虽然使用它可以实现您的需要,但它的成本很高。
1.加载外业数据的开销很大
1.加载后,它将在Lucene段的生命周期内保持不变
1.因为您的字段是文本,所以它将占用大量堆空间。
但是,您可以使用fielddata_frequency_filter控制加载到内存中的项数
然后对text字段进行排序,文档中的建议是
相反,您应该有一个用于全文搜索的文本字段,以及一个为聚合启用了doc_values的未分析关键字字段
因此,您需要根据数据大小、数据访问模式和服务器成本进行选择,以防您有更多数据并计划使用field data

相关问题