하이버 네이트 검색을 사용하여 웹 페이지의 여러 입력 필드에서 정교한 자동 입력 기능을 구현하고 싶습니다. 각 입력 필드는 자체 엔터티 용이며, Country
및 City
이라고 가정 해 봅니다. 두 엔티티 간에는 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
결과가 없습니다.
오, 알겠습니다. 특정 정렬 옵션을 감독합니다 (FacetSortOrder.FIELDVALUE라고 말하고 싶습니다). 의견의 첫 번째 부분에 관하여 : 내 문제는 하나의 쿼리에서 조건을 결합하는 것이 아니라 원하는 엔터티를 얻는 것입니다. 모든 반환 된 행은 기준과 일치하지만 일치하는 국가를 얻고 싶습니다. 국가가 '스페인'과 일치하는 도시는 아닙니다. 나는 그 질문을 갱신 할 것이다. – rainer198