1

我有一Movie堂课name。我想与其中包含空格的电影名称匹配,以查找没有空格的查询词。

例如:Toy Story当搜索词为 时,我希望带有名称的电影出现在结果中toystory

如何编写我的 Hibernate Search DSL 查询?

4

2 回答 2

0

解决这个问题的一种方法实际上是索引时间解决方案。您可以使用自定义分析器将电影标题作为连接(无空格)字符串添加到索引中。这样您就可以免费获得所需的功能。

于 2013-11-05T21:38:08.710 回答
0

使用 a和过滤器将分析器添加到Movie类中,然后将此分析器用于名称字段:NGramFilterFactoryLowerCaseFilterFactory

@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();
于 2013-12-26T09:41:55.650 回答