如何使用 Spring Data Solr 搜索嵌套对象?
Posted
技术标签:
【中文标题】如何使用 Spring Data Solr 搜索嵌套对象?【英文标题】:How to search nested object by using Spring Data Solr? 【发布时间】:2012-12-20 02:55:01 【问题描述】:我有两个这样的 Java 对象:
public class PSubject
@Column
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
@org.apache.solr.client.solrj.beans.Field("name")
private String name;
@Column
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
@org.apache.solr.client.solrj.beans.Field("type")
private String type;
@Column
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
@org.apache.solr.client.solrj.beans.Field("uri")
private String uri;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@IndexedEmbedded
@org.apache.solr.client.solrj.beans.Field("attributes")
private Set<PAttribute> attributes = new HashSet<PAttribute>();
.....
@Entity
@Indexed
@Table(name="PAttribute")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class PAttribute extends PEntity
private static final long serialVersionUID = 1L;
@Column
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.YES)
@org.apache.solr.client.solrj.beans.Field("attr_name")
private String name;
@Column
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.YES)
@org.apache.solr.client.solrj.beans.Field("attr_value")
private String value;
.....
还有我的 Spring Data Solr 查询接口:
public interface DerivedSubjectRepository extends SolrCrudRepository<PSubject, String>
Page<PSubject> findByName(String name, Pageable page);
List<PSubject> findByNameStartingWith(String name);
Page<PSubject> findBy(Pageable page);
@Query("name:*?0* or description:*?0* or type:*?0* or mac_address:*?0* or uri:*?0* or attributes:*?0*")
Page<PSubject> find(String keyword,Pageable page);
@Query("name:*?0* or description:*?0* or type:*?0* or mac_address:*?0* or uri:*?0* or attributes:*?0*")
List<PSubject> find(String keyword);
我可以按名称、描述、类型和 mac_address 搜索任何内容,但无法按属性搜索任何结果。
更新:
例如,当用户搜索“ipod”时,它可能表示主题的类型或主题的名称,或者属性的名称或属性的值。我想在一个请求中获得所有匹配的主题。我知道我可以在单独的查询中搜索属性对象。但这会使后端的代码变得复杂。
那么,我该如何搜索这个嵌套对象呢?
更新:
我扁平化了我的数据:
@Transient
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
@org.apache.solr.client.solrj.beans.Field("attrs")
private String attrs;
public String getAttrs()
return attrs;
public void setAttrs(Set<PAttribute> attributes)
StringBuffer attrs = new StringBuffer();
if(attributes==null)
attributes = this.getAttributes();
for(PAttribute attr:attributes)
attrs.append(attr.getName()+" " + attr.getValue()).append(" ");
this.attrs =attrs.toString();
问题已解决。
【问题讨论】:
【参考方案1】:IIRC 无法在 solr 中存储嵌套数据结构 - 这取决于您如何展平数据以适应例如。多值字段 - 不知道您的架构有点困难。 见:http://lucene.472066.n3.nabble.com/Possible-to-have-Solr-documents-with-deeply-nested-data-structures-i-e-hashes-within-hashes-td4004285.html
你索引中的数据是什么样子的,你有没有看过spring-data-solr发送的http请求?
【讨论】:
感谢您的回复。而且我不知道如何展平我的数据。以上是关于如何使用 Spring Data Solr 搜索嵌套对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 EmbeddedSolrServer 和多核支持设置 Spring Data Solr?
Apache Solr 的 Spring Data (数据)