2012-10-23 4 views
2

내 엔티티를 인덱싱 할 때 내 사용자 정의 분석기를 사용하도록 최대 절전 모드 검색을 구성했습니다. 그러나 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이 쿼리를 실행하기 전에 자동으로 실행되도록 할 수 있습니까?

+0

Session을 통해서 또는 EntityManager를 통해서만 직접 전체 텍스트 쿼리를 시도 했습니까? –

+0

나는 가지고 있지 않았지만 방금 테스트 한 결과를 예제에 추가했습니다. Session이나 EntityManager를 사용하면 native Hibernate-Search로 올바른 결과를 얻는다. QueryDSL을 사용하고 있는지 보여주기 위해 예제를 확장했습니다. 분석기를 적용한 후 Lucene에 저장되는 방법을 검색하면 작동하도록 할 수 있습니다. – redZebra2012

+0

좋아, 그래서 그것을 찾은 것, 또는 적어도 내가 찾고있는 쿼리를 얻는 방법. Mysema에서 일하는 것 같아요. 그래서 내 질문에 대답하기 전에 이걸 달아나겠습니다. Hibernate-Search를 위해 QueryDSL로 생성 된 쿼리는 Hibernate-Search로 전달되었을 때 명시 적으로 동일하게 생성되는 것처럼 보인다. 그러나 QueryDSL의 Hibernate-Search 모듈은 또한 내가 찾고있는 결과를 제공하는 새로운 술어 인 LuceneUtils.fuzzyLike (propertyPath, value)를 제공한다. 나는 Lucene을 질의 할 때 object.propertyPath.like (value) 대신에 그 값을 사용해야한다고 생각합니다. – redZebra2012

답변

0

질문에 대해서는 DSL 쿼리를 사용할 때 분석기가 기본값으로 적용됩니다. 대부분의 경우 인덱싱 및 검색에 동일한 분석기를 사용하는 것이 좋습니다. 이러한 이유 때문에 분석기는 'ignoreAnalyzer'가 사용되지 않는 한 기본값별로 적용됩니다.

두 번째 예제가 작동하지 않는 이유 나는 당신에게 말할 수 없습니다. SearchQuery은 Hibernate Search 또는 ORM API의 일부가 아닙니다. 애플리케이션의 내부 클래스 여야합니다. 이 수업에서 어떤 일이 일어 났습니까? 어떤 유형의 쿼리를 사용하고 있습니까?

+0

질문은 Querydsl 프레임 워크에 관한 것이지, 최대 절전 모드 검색을위한 Query DSL에 관한 질문은 아닙니다. 프레임 워크 인 Querydsl은 Hibernate Search를 지원하며, SearchQuery는 이것의 일부이다. –

+0

알았어. 그래도 후드 아래에서 무슨 일이 일어나는지 이해해야합니다. 또한 두 번째 예제는 뭔가 빠져있는 것 같습니다. 실제 검색 기준은 어디에 있습니까? – Hardy

+0

하디에게 응답 해 주셔서 감사합니다. Timo는 내가 Hibernate-Search를 사용하지 않고 QueryDSL을 사용하여 Hibernate-Search를 쿼리하는 것에 대해 이야기하는 것이 맞다. 네이티브 Hibernate-Search를 사용할 때 잘 동작합니다. – redZebra2012