내 엔티티를 인덱싱 할 때 내 사용자 정의 분석기를 사용하도록 최대 절전 모드 검색을 구성했습니다. 그러나 QueryDSL의 Hibernate-Search 통합으로 검색을 시도 할 때 엔티티를 찾지 못하지만, 만약 내가 똑바로 최대 절전 모드로 검색을 사용하면 뭔가를 찾는다.Lucene 분석기를 사용하여 QueryDSL & Hibernate-Search
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
@Parameter(name = "language", value = "English")
})
})
@Analyzer(definition = "customanalyzer")
public abstract class Post extends BaseEntity {}
제목이 "게으른 개를 뛰어 넘은 빠른 갈색 여우"라는 제목으로 엔티티를 색인화했습니다.
이 일 ...
List articlePosts = fullTextEntityManager.createFullTextQuery(queryBuilder.keyword().onFields("title").matching("jumped").createQuery(), ArticlePost.class).getResultList(); // list of 2
List articlePosts = fullTextSession.createFullTextQuery(queryBuilder.keyword().onFields("title").matching("jumped").createQuery(), ArticlePost.class).getResultList(); // list of 2
이하지 않습니다 ...
SearchQuery<ArticlePost> query = new SearchQuery<ArticlePost>(this.entityManagerFactory.createEntityManager().unwrap(HibernateEntityManager.class).getSession(), post);
List articlePosts = query.where(post.title.contains("jumped")).list() // empty list
그러나이 가능성 루씬 (SnowballPorter의 가능한 결과), 다음 작동에 저장되는 방법과 검색 ...
SearchQuery<ArticlePost> query = new SearchQuery<ArticlePost>(this.entityManagerFactory.createEntityManager().unwrap(HibernateEntityManager.class).getSession(), post);
List articlePosts = query.where(post.title.contains("jump")).list() // list of 2
QueryDSL을 사용할 때 분석기가 쿼리를 실행하기 전에 실행되지 않는 것처럼 보입니다. 와이. 누구나 이것이 문제인지 확인할 수 있습니까? QueryDSL이 쿼리를 실행하기 전에 자동으로 실행되도록 할 수 있습니까?
Session을 통해서 또는 EntityManager를 통해서만 직접 전체 텍스트 쿼리를 시도 했습니까? –
나는 가지고 있지 않았지만 방금 테스트 한 결과를 예제에 추가했습니다. Session이나 EntityManager를 사용하면 native Hibernate-Search로 올바른 결과를 얻는다. QueryDSL을 사용하고 있는지 보여주기 위해 예제를 확장했습니다. 분석기를 적용한 후 Lucene에 저장되는 방법을 검색하면 작동하도록 할 수 있습니다. – redZebra2012
좋아, 그래서 그것을 찾은 것, 또는 적어도 내가 찾고있는 쿼리를 얻는 방법. Mysema에서 일하는 것 같아요. 그래서 내 질문에 대답하기 전에 이걸 달아나겠습니다. Hibernate-Search를 위해 QueryDSL로 생성 된 쿼리는 Hibernate-Search로 전달되었을 때 명시 적으로 동일하게 생성되는 것처럼 보인다. 그러나 QueryDSL의 Hibernate-Search 모듈은 또한 내가 찾고있는 결과를 제공하는 새로운 술어 인 LuceneUtils.fuzzyLike (propertyPath, value)를 제공한다. 나는 Lucene을 질의 할 때 object.propertyPath.like (value) 대신에 그 값을 사용해야한다고 생각합니다. – redZebra2012