2014-01-25 3 views
0

Я поле определяется в моей модели как:Hibernate поиск подстановочные не возвращать ожидаемое значение

@Column(name = "name") 
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO) 
private String name; 

и мой запрос

public Result search(String term, int offset, int limit) { 
    WildcardQuery regexQuery = new WildcardQuery(new org.apache.lucene.index.Term("name", "*" + term + "*")); 

    QueryBuilder qb = getFullTextSession().getSearchFactory().buildQueryBuilder().forEntity(Company.class).get(); 
    org.apache.lucene.search.Query query = 
      qb.bool().should(qb.phrase().onField("address.street").sentence(term).createQuery()) 
      .should(regexQuery) 
      .createQuery(); 

    FullTextQuery hibQuery = getFullTextSession().createFullTextQuery(query, Company.class); 

    hibQuery.setFirstResult(offset); 
    hibQuery.setMaxResults(limit); 

    Result result = new Result(); 
    result.total = hibQuery.getResultSize(); 
    result.items = hibQuery.list(); 

    return result; 
} 

Я значение в базе данных (также индексируются) «Интерспринт ГмбХ». Если я позвоню методу:

поиск ("Interspr");

Я ожидаю получить эту сущность, но результат был пуст. Любое предложение, как я могу построить запрос «содержит»?

ответ

1

Мое предположение - это капитализация. Я предполагаю, что «Intersprint GmbH» индексируется как два токена - «intersprint» и «gmbh» (все строчные буквы, потому что был применен анализатор. Во время запроса вы используете WildcardQuery с заданным термином «Interspr». в данном случае означает, что вы не имеете соответствия между нижней обсадной трубой «intersprint» и подстановочным запросом «Inter». вы можете подтвердить это путем проверки индекса с Лукой.

в качестве решения можно либо использовать QueryParser (который также использует анализатор) или вы используете QueryBuilder # ключевое слово # wildcard(), которое также применит анализатор. В последнем случае правильный анализатор должен быть даже прозрачным для вас.

Смежные вопросы