有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    @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时,名为Toy Story的电影肯定会出现在结果中,只需使用下一个查询:

    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();