2011-04-09 16 views
2

比方說,我有一個看起來像這樣的域對象搜索列表 場: 如何註釋允許使用Hibernate Search的

@Entity 
@Indexed 
public class Thingie implements DomainObject { 

private Long id;   
private Integer version; 

private String title;  
private List<String> keywords = new Vector<String>();  

@Id 
@GeneratedValue 
public Long getId() { 
    return id; 
} 
public void setId(Long id) { 
    this.id = id; 
} 

@Version 
public Integer getVersion() { 
    return version; 
} 
public void setVersion(Integer version) { 
    this.version = version; 
} 

@Column(length=64, nullable=false) 
@Field(index=Index.TOKENIZED,store=Store.NO) 
public String getTitle() { 
    return title; 
} 
public void setTitle(String title) { 
    this.title = title; 
} 


@ElementCollection 
    // what do I put here?? 
public List<String> getKeywords() { 
    return keywords; 
} 
public void setKeywords(List<String> keywords) { 
    this.keywords = keywords; 
}  
} 

如何註釋的關鍵字字段,這樣我可以做一個搜索像這樣可以對標題和關鍵字進行全文搜索:

org.apache.lucene.search.Query query = qb.keyword().onFields("title","keywords") 
.matching("search").createQuery(); 

回答

5

你可以使用StringBridge。檢查4.2.2.1。 StringBridge在

http://docs.jboss.org/hibernate/search/3.1/reference/en/html/search-mapping-bridge.html

例如,如果您存儲在數據庫中的關鍵字的格式:AA,BB,CC

@FieldBridge(impl=CollectionToCSVBridge.class) //your bridge implementation 
private List<String> keywords; 

一種實現方式可以是:

public class CollectionToCSVBridge implements StringBridge 
{ 
    public String objectToString(Object value) 
    { 
     if(value != null) 
     { 
      StringBuffer buf = new StringBuffer(); 

      Collection<?> col = (Collection<?>)value; 
      Iterator<?> it = col.iterator(); 
      while(it.hasNext()) 
      { 
       String next = it.next().toString(); 
       buf.append(next); 
       if(it.hasNext()) 
        buf.append(", "); 
      } 
      return buf.toString(); 
     } 
     return null; 
    } 
}