2011-04-09 43 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; 
    } 
}