Lucene Hibernate搜索组合字段的自动更新
我有一个Person实体,具有多个与姓名相关的属性firstName、lastName、title。 所有与名称相关的属性都应该存储在一个lucene索引字段fullName中 @索引 @实体 公共阶层人士{ ... 私有字符串名; 私有字符串lastName; 私有字符串标题; @Fieldstore=Store.NO,index=index.TOKENIZED 公共字符串getFullName{ 返回firstName++lastName++title; } } 我面临的唯一问题是在更新与名称相关的属性时自动更新索引中的全名 有没有办法告诉Hibernate Search fullName是一个组合字段,当其中一个部分发生更改时必须进行更新?也许是这样的 @组合{firstName,lastName,title}Lucene Hibernate搜索组合字段的自动更新,lucene,hibernate-search,Lucene,Hibernate Search,我有一个Person实体,具有多个与姓名相关的属性firstName、lastName、title。 所有与名称相关的属性都应该存储在一个lucene索引字段fullName中 @索引 @实体 公共阶层人士{ ... 私有字符串名; 私有字符串lastName; 私有字符串标题; @Fieldstore=Store.NO,index=index.TOKENIZED 公共字符串getFullName{ 返回firstName++lastName++title; } } 我面临的唯一问题是在更新与名
谢谢大家! 您的问题有几种解决方案,如果您选择的解决方案可能是您的品味问题,那么您也可以将它们结合使用: 检查属性_hibernate.search。启用_dirty_check_uu并确保在您的情况下将其设置为false。默认值为true。有关更多信息,请参阅在线文档- 将@Field注释也添加到firstName、lastName和title。你会得到一个更大的索引大小,但通常这并不重要。作为一个副作用,脏检查将在假设您的JPA注释是正确的情况下工作。例如,我假设getFullName是暂时的 使用类桥并可以选择删除getFullName。使用类桥还将自动禁用脏检查优化
对于您的问题,有几种解决方案,如果您选择的解决方案可能是您的品味问题,您也可以将它们结合使用: 检查属性_hibernate.search。启用_dirty_check_uu并确保在您的情况下将其设置为false。默认值为true。有关更多信息,请参阅在线文档- 将@Field注释也添加到firstName、lastName和title。你会得到一个更大的索引大小,但通常这并不重要。作为一个副作用,脏检查将在假设您的JPA注释是正确的情况下工作。例如,我假设getFullName是暂时的 使用类桥并可以选择删除getFullName。使用类桥还将自动禁用脏检查优化 这是可能的,因为您选择了TOKENIZED,并且我假设您的分析器设置为在添加空格以分隔记号的同时拆分空格上的记号:您可以对同一字段进行多次重复,结果几乎与拆分复合项相同 我这样说几乎是因为,如果您需要一个短语查询来查找特定的关键字顺序,它将无法确定术语的顺序 对于更复杂的情况,您可以使用一个类桥来禁用脏检查优化,在这种情况下,脏检查优化一直困扰着您:Hibernate搜索跟踪是否实际写入了任何持久字段,以确定它是否可以跳过昂贵的重新索引操作,但随后无法检测到此类技巧 这是可能的,因为您选择了TOKENIZED,并且我假设您的分析器设置为在添加空格以分隔记号的同时拆分空格上的记号:您可以对同一字段进行多次重复,结果几乎与拆分复合项相同 我这样说几乎是因为,如果您需要一个短语查询来查找特定的关键字顺序,它将无法确定术语的顺序
对于更复杂的情况,您可以使用一个类桥来禁用脏检查优化,在这种情况下,脏检查优化一直困扰着您:Hibernate搜索跟踪是否有任何持久性字段被实际写入,以决定它是否可以跳过昂贵的重新索引操作,但随后无法检测到此类技巧。Nice!这完全符合我的需要。我一直认为这个名字一定是独一无二的。很好!这完全符合我的需要。我一直认为这个名字必须是唯一的。很好的选择。我知道班级桥梁,但我认为它们对于我的简单需求来说有点过分了。在我看来,禁用全局脏检查也有点过分了。我更愿意为所有其他字段编制索引,但最终还是选择了Sannes解决方案。我还对你的答案投了赞成票。谢谢不错的选择。我知道班级桥梁,但我认为它们对于我的简单需求来说有点过分了。在我看来,禁用全局脏检查也有点过分了。我更愿意为所有其他字段编制索引,但最终还是选择了Sannes解决方案。我还对你的答案投了赞成票。谢谢
@Indexed
@Entity
public class Person {
...
@Field(name="fullName") String firstName;
@Field(name="fullName") String lastName;
@Field(name="fullName") String title;
}