2011-12-16 4 views
0

하이버 네이트 검색을 사용하여 웹 페이지의 여러 입력 필드에서 정교한 자동 입력 기능을 구현하고 싶습니다. 각 입력 필드는 자체 엔터티 용이며, CountryCity이라고 가정 해 봅니다. 두 엔티티 간에는 many-to-one 관계가 있습니다. (국가에는 도시가 포함됨).Hibernate Search : 임베디드 엔티티를 쿼리하는 방법

자동 검색 기능은 입력 할 때와 같이 작동해야합니다. 국가 이름 접두사와 도시 필드가 이미 채워져 있으면 과 같은 도시가있는 국가에 대해서만 추천을받을 수 있습니다 (반대의 경우도 마찬가지 임).

서버 쪽 자동 대응 서비스는 입력 필드 (드롭 다운, 뭐든간에)로 렌더링되는 (entityId, entityName) 프로젝션 목록을 반환해야합니다.

SearchMapping mapping = new SearchMapping(); 

    mapping.analyzerDef(... 
    .entity(City.class).indexed().indexName("MyIndex") 
     .property("cityId", ElementType.FIELD) 
      .documentId() 
      .name("id") 
    .property("name", ElementType.FIELD) 
      .documentId() 
      .name("id") 
     .property("country", ElementType.METHOD) 
      .indexEmbedded() 
    .entity(Country.class).indexed() 
     .property("id", ElementType.FIELD) 
      .documentId() 
      .name("id") 
     .property("name", ElementType.METHOD) 
      .field() 
      .name("name") 

이 맵핑, 오른쪽 주요 엔티티로 City을 정의한다 : 나는 다음과 같은 인덱스 스키마를 시도 수동 스키마에 읽기 후에 따르면

?
나는 모든 도시의 색인을 생성했으며 두 도시를 결합하여 쿼리 할 수 ​​있습니다. 그러나 도시를 쿼리 할 때만 일치합니다. 예 : fullTextSession.getSearchFactory() .buildQueryBuilder(). forEntity (City.class) .get();

"Spain"을 입력 할 때 국가 필드에 유용하지 않습니다. 스페인의 각 도시마다 하나의 행이 있습니다. (스페인, 스페인, 스페인, 스페인, ....-))

질문은 : 국가 엔티티를 검색하는 방법은 무엇입니까? 색인 구조 변경? 색인 생성 절차? 또는 쿼리하는 방법?

내가 찾은 유일한 방법은 country에 대한 패싯을 설정하는 것이고, 다른 가능한면은 자동 강조 기능입니다. 그러나 패싯을 사전 순으로 정렬 할 수 없기 때문에이 역시 완전하지 않습니다.

물론이 예제에서는 매핑에서 두 엔티티를 전환 할 수 있지만 더 복잡한 엔티티 그래프가있는 시나리오를 가정합니다.

UPDATE : 건물의 질의에 대한 의견

에 요청 추가 쿼리, 나는 QueryBuilder를 사용합니다. 쿼리

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class).get(); 

: 다음은 스페인의 예에서와 같이 설정 결과를 생성

country.name:Spain 

나는 국가

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Country.class).get(); 

및 쿼리에 대한 쿼리 빌더를 사용하려고하면 :

name:Spain 

결과가 없습니다.

답변

1

실제 검색어가 표시되지 않습니다. 쿼리 DSL을 사용할 필요는 없지만 기본 Lucene 쿼리를 작성할 수도 있습니다. 두 경우 모두 (DSL 또는 기본 Lucene) 부울 논리를 통해 쿼리를 결합 할 수 있습니다.임베디드 엔티티는 Java Bean 표기법을 따릅니다. 국가 이름은 예를 들어 도시 쿼리에서 country.name으로 도달합니다. 다시 말하지만, 실제 쿼리가 없으면 더 구체적인 피드백을 제공하기가 어렵습니다.

마지막으로, 패싯은 사전 순으로 정렬 할 수도 있습니다. FacetSortOrder.COUNT_DESC를 확인하십시오.

+0

오, 알겠습니다. 특정 정렬 옵션을 감독합니다 (FacetSortOrder.FIELDVALUE라고 말하고 싶습니다). 의견의 첫 번째 부분에 관하여 : 내 문제는 하나의 쿼리에서 조건을 결합하는 것이 아니라 원하는 엔터티를 얻는 것입니다. 모든 반환 된 행은 기준과 일치하지만 일치하는 국가를 얻고 싶습니다. 국가가 '스페인'과 일치하는 도시는 아닙니다. 나는 그 질문을 갱신 할 것이다. – rainer198

관련 문제