gpt4 book ai didi

java - 将世界上所有国家和城市存储在 Lucene 索引中是好还是坏主意?

转载 作者:行者123 更新时间:2023-12-02 02:34:20 24 4
gpt4 key购买 nike

我读到,通过将所需的字段存储在索引本身内,可以在搜索实体时消除与数据库的往返。然而我也读到这会增加索引,并且经验法则是索引越小搜索速度越快。我想存储一个国家、一个城市和一个 float 组。它涉及世界上所有的城市和国家。那么什么更快呢?将所有内容存储在索引中还是从数据库中检索它们?

    @Entity
@Indexed
public class Location implements Serializable {
@Id
@GeneratedValue(generator = "ID_GENERATOR")
private Long id;

@DocumentId(name = "_documentId")
@Field(store = Store.YES)
private String country;

@Field(store = Store.YES)
private String city;

@Field(store = Store.YES)
private String province;

@Field(store = Store.YES, index = Index.NO)
private final float[] temperatures = new float[12];

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getCountry() {
return country;
}

public void setCountry(String country) {
this.country = country;
}

public String getCity() {
return city;
}

public void setCity(String city) {
this.city = city;
}

public String getProvince() {
return province;
}

public void setProvince(String province) {
this.province = province;
}

public float[] getTemperatures() {
return temperatures;
}
}

另外,谁能告诉我 Hibernate 搜索投影或 Lucene 索引的确切存储位置?它们似乎不像 Elastic Search 那样存储为 JSON 文件。所有内容都存储在 RAM 内存中吗?

问候

最佳答案

这是一个好主意还是坏主意取决于很多因素。一般来说,我希望这是一个好主意,但这假设您的数据库往返实际上很慢,并且跳过此操作有助于从数据库中获取一些负载,以保持该处理能力可用于其他查询。

不过,您可以通过启用 Hibernate 的二级缓存来实现相同的目标,因此您实际上必须将三种方法的步骤进行比较:

  • 从 Lucene 索引加载它们
  • 从 Hibernate ORM 二级缓存(堆内缓存)加载它们
  • 使用 JDBC 连接从 RDBMS 加载

通常,您可能希望限制 JVM 堆的大小,以保持应用程序的响应能力并更容易调整 GC;这意味着二级缓存的大小是有限的,并且可能需要由其他数据点使用,这些数据点从适当的缓存可以提供的智能驱逐算法中受益更多。

存储在 Lucene 索引中是一种全/无方法,因此您正在做出的设计决策不会自动平衡内存使用和缓存命中有用性......但 Lucene 索引通常存储在内存映射文件系统中所以你实际上受益于 native 内存来缓存它,所以是的,只要有一些空闲 RAM 可用于此目的,你就会受益于 RAM。

简而言之:我认为值得尝试,好处通常很强。但要通过测量来验证!

关于java - 将世界上所有国家和城市存储在 Lucene 索引中是好还是坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46622239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com