2010-04-16 6 views
2

나는 디렉토리에서 인덱싱 한 일부 데이터를 검색하기 위해 Hibernate Search (Lucene 사용)를 사용하고 있습니다. 그것은 잘 작동하지만 역방향 검색을해야합니다. 역 검색을 사용하면 데이터베이스에 저장된 쿼리 목록이 있다는 의미입니다. 데이터 개체를 만들 때마다 이러한 쿼리 중 하나가 데이터 개체와 일치하는지 확인해야합니다. 데이터 객체가 생성 한 쿼리와 일치 할 때 사용자에게 경고해야합니다. 그래서 방금 생성 된이 단일 데이터 객체를 색인화하고 목록의 어떤 쿼리가이 객체를 결과로 가져야하는지 확인해야합니다.최대 절전 모드에서 역방향 검색

나는 (매우 효율적되지 않을 것 쿼리의 자바 목록에 반복하지만) 목록에있는 모든 쿼리에 대한 예처럼 뭔가를 할 수 있도록 루씬 MemoryIndex 클래스가 메모리에 인덱스를 생성하는 본 적이 :

//Iterating over my list<Query> 
MemoryIndex index = new MemoryIndex(); 
//Add all fields 
index.addField("myField", "myFieldData", analyzer); 
... 
QueryParser parser = new QueryParser("myField", analyzer); 
float score = index.search(query); 
if (score > 0.0f) { 
    System.out.println("it's a match"); 
} else { 
    System.out.println("no match found"); 
} 

여기이 문제는이 데이터 클래스가 FullTextEntityManager 인스턴스에서 index() 메서드를 호출 할 때 필드를 인덱싱하는 방법을 나타내는 @ Field, @ IndexedEmbedded, 등의 여러 Hibernate 검색 주석이 있다는 것입니다. 디렉토리에있는 객체의 색인을 생성한다. 이 정보를 사용하여 메모리에 색인을 생성하는 유사한 방법이 있습니까?

역 검색을 수행하는보다 효율적인 방법이 있습니까?

답변

4

자동 인덱싱을 사용하는 경우 현재 트랜잭션을 커밋하는 것 외에 다른 작업을 수행 할 필요가없는 새로운 개체를 인덱싱 한 다음 실행할 쿼리를 검색하고 모든 쿼리를 부울 쿼리로 검색하고 새 오브젝트의 ID로 저장된 조회. 이 같은 것 :

... 
BooleanQuery query = new BooleanQuery(); 
query.add(storedQuery, BooleanClause.Occur.MUST); 
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST); 
... 

결과를 얻으면 쿼리가 일치한다는 것을 알 수 있습니다.

0

MemoryIndex는 Lucene의 Directory 나 IndexReader를 확장하거나 구현하지 않는 완전히 별개의 구성 요소이기 때문에 이것을 Hibernate Search Annotation에 연결할 수있는 방법이 없다고 생각합니다. 나는 MemoryIndex를 사용하기로 결정했다면, 당신이 주석에서 무엇을하고 있는지를 기본적으로 반영하는 addField() 호출을 작성해야 할 것이라고 생각한다.

여기에서 몇 가지 검색어를 말하고 있습니까? Hibernate가 유지하고있는 메인 인덱스에서 쿼리를 실행하는 것만으로 도망 갈 수있는 사용자 수에 따라 방금 추가 한 문서 ID로 검색을 제한 할 수 있습니다. 또는 추가 된 모든 문서에 대해 RAMDirectory를 사용하여 단일 문서 인 메모리 색인을 작성하고이를 통해 쿼리를 실행하십시오.

관련 문제