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