2016-10-04 67 views
0

我有我想查詢以下索引POJO:的Hibernate搜索通配符搜索不返回預期的結果

@Entity 
@Indexed 
@AnalyzerDef(name="userAnalyzer", 
      tokenizer = @TokenizerDef(factory=StandardTokenizerFactory.class), 
      filters = { 
       @TokenFilterDef(factory=LowerCaseFilterFactory.class), 
       @TokenFilterDef(factory=SnowballPorterFilterFactory.class, params = { 
             @Parameter(name="language", value="English" 
       }) 
      } 
) 
public class User { 
    @Id 
    private long id; 

    @IndexEmbedded 
    private List<Address> addresses; // Address.street is what I am looking for 

    @Field 
    private String firstName; 

    @Field 
    private String lastName; 

    private List<AKA> akas; 

    private List<Wife> wives; 

    ... 

} 

從本質上講,我試圖做在Hibernate中搜索以下SQL(Lucene的):

select u.* 
from User 
where u.firstName like ':fname%' 
and u.lastName like ':lname%' 

以下是我有什麼不工作始終:

... 
    if(Objects.nonNull(u.getFirstName()){ 
     luceneBoolQuery.must(queryBuilder.keyword().wildcard().onField("firstName").matching(u.getFirstName().toLowerCase()).createQuery()); 
    } 
    if(Objects.nonNull(u.getLastName()){ 
     luceneBoolQuery.must(queryBuilder.keyword().wildcard().onField("lastName").matching(u.getLastName().toLowerCase()).createQuery()); 
    } 
    Query luceneQuery = luceneBoolQuery.createQuery(); 

    Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, User.class); 
    ... 
    ... 

可以將某些一個幫助我製作這個查詢來撤回上面的SQL會返回什麼?

回答

0

您的查詢不包含字符串通配符('*')。也許這會按你想要的方式工作?

... 
if(Objects.nonNull(u.getFirstName()){ 
    luceneBoolQuery.must(queryBuilder.keyword().wildcard().onField("firstName").matching(u.getFirstName().toLowerCase() + "*").createQuery()); 
} 
if(Objects.nonNull(u.getLastName()){ 
    luceneBoolQuery.must(queryBuilder.keyword().wildcard().onField("lastName").matching(u.getLastName().toLowerCase() + "*").createQuery()); 
} 
Query luceneQuery = luceneBoolQuery.createQuery(); 

Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, User.class); 
... 
... 

此外,您的分析儀只定義,不歸屬於您的領域,所以您的搜索將仍然區分大小寫。

你需要添加@Analyzer註釋:

@Field 
@Analyzer(definition = "userAnalyzer") 
private String firstName; 

@Field 
@Analyzer(definition = "userAnalyzer") 
private String lastName; 

或者,您可以添加在全班註釋:

@Entity 
@Indexed 
@AnalyzerDef(name="userAnalyzer", 
      tokenizer = @TokenizerDef(factory=StandardTokenizerFactory.class), 
      filters = { 
       @TokenFilterDef(factory=LowerCaseFilterFactory.class), 
       @TokenFilterDef(factory=SnowballPorterFilterFactory.class, params = { 
             @Parameter(name="language", value="English" 
       }) 
      } 
) 
@Analyzer(definition="userAnalyzer") // Difference HERE 
public class User { 
... 

...當然,你必須在測試之前重新索引您的數據。

有關使用分析儀的更多信息,請參閱參考文檔:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_analyzer