我是使用Hibernate Search的新手,这是我的实现: 我从实体及其领域开始
@AnalyzerDef(name = "ngram",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class ),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class,
params = {
@Parameter(name = "minGramSize", value = "3"),
@Parameter(name = "maxGramSize", value = "3") } )
}
)
@Indexed
@Entity
@Table(name="USERS")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Field
@Column(nullable=false,length=30,name="first_name")
private String firstName;
@Column(nullable=false,length=30,name="last_name")
private String lastName;
@Column(length=128)
@Field(analyzer=@Analyzer(definition="ngram"))
private String login;
@Column(length=255)
private String password;
在我的数据库中,我有2条记录,其中包含以下数据:
| id | first_name | last_name |登录|密码|
| 1 | NULL | NULL | mednabli | * | | 2 | NULL | NULL | med-nabli | * |
当我对字段登录进行研究时,我会显示结果的登录信息:
键入关键字:med
结果:mednabli med-nabli
键入关键字:med -
结果:(没有),而我需要获得med-nabli
键入关键字:nabli
结果:med-nabli,而我需要获得mednabli med-nabli
键入关键字:kamed
结果:(没有),而我需要获得mednabli med-nabli
那么有没有办法让搜索得到理想的结果,是否有一个分析器,我应该依靠它来使我的应用程序正常运行我想要?
答案 0 :(得分:1)
所以,首先,你只能通过一个领域获得你想要的东西。因此,您需要创建另一个字段(请参阅@Fields注释以在单个属性上定义多个字段)。此新字段应包含关键字标记生成器和小写过滤器。然后,您应该通过查询两个字段(带有一个)来查询第二个字段是通配符查询" yoursearch "来构建查询。
这将解决您的所有情况,除了这一个:"键入的关键字:kamed"。至于这个,您能提供构建和执行查询的方式吗?
注意:在您的登录搜索中定义停止过滤器不是一个好主意,因此您应将其删除。