我有一Movie
堂课name
。我想与其中包含空格的电影名称匹配,以查找没有空格的查询词。
例如:Toy Story
当搜索词为 时,我希望带有名称的电影出现在结果中toystory
。
如何编写我的 Hibernate Search DSL 查询?
我有一Movie
堂课name
。我想与其中包含空格的电影名称匹配,以查找没有空格的查询词。
例如:Toy Story
当搜索词为 时,我希望带有名称的电影出现在结果中toystory
。
如何编写我的 Hibernate Search DSL 查询?
解决这个问题的一种方法实际上是索引时间解决方案。您可以使用自定义分析器将电影标题作为连接(无空格)字符串添加到索引中。这样您就可以免费获得所需的功能。
使用 a和过滤器将分析器添加到Movie
类中,然后将此分析器用于名称字段:NGramFilterFactory
LowerCaseFilterFactory
@Indexed
@AnalyzerDef(name = "ngram", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class, params = {
@Parameter(name = "minGramSize", value = "3"),
@Parameter(name = "maxGramSize", value = "10")
})
})
public class Movie{
@Field( analyze = Analyze.YES )
@Analyzer( definition="ngram" )
private String name;
// standard setters and getters go here
}
当搜索词为 时,带有名称的电影Toy Story
肯定会出现在结果中toystory
,只需使用下一个查询:
QueryBuilder qb = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity( Movie.class ).get();
org.apache.lucene.search.Query query = qb
.keyword()
.onField("name")
.matching("toystory");
.createQuery();
org.hibernate.Query hibQuery =
fullTextSession.createFullTextQuery(query, Movie.class);
List result = hibQuery.list();