2011-03-09 83 views
7

我正在使用Solrs TermsComponent实现自动填充功能。我的文档包含我已在“标签”字段中编入索引的标签。现在我可以使用TermsComponent找出在所有存储的文档中使用哪些标签。到目前为止,这工作得很好。将Solr的TermsComponent中的术语限制为源自某些文档的术语

但是还有一些额外的要求:每个文档都有一个所有者字段,其中包含拥有它的用户的ID。自动完成列表应只包含来自文档的标签,请求自动完成的用户实际上拥有该标签。

我试图设置查询参数,但是这似乎是由TermsComponent被忽略:

public static List<String> findUniqueTags(String beginningWith, User owner) throws IOException { 
    SolrParams q = new SolrQuery().setQueryType("/terms") 
      .setQuery("owner:" + owner.id.toString()) 
      .set(TermsParams.TERMS, true).set(TermsParams.TERMS_FIELD, "tags") 
      .set(TermsParams.TERMS_LOWER, beginningWith) 
      .set(TermsParams.TERMS_LOWER_INCLUSIVE, false) 
      .set(TermsParams.TERMS_PREFIX_STR, beginningWith); 
    QueryResponse queryResponse; 
    try { 
     queryResponse = getSolrServer().query(q); 
    } catch (SolrServerException e) { 
     Logger.error(e, "Error when querying server."); 
     throw new IOException(e); 
    } 

    NamedList tags = (NamedList) ((NamedList)queryResponse.getResponse().get("terms")).get("tags"); 

    List<String> result = new ArrayList<String>(); 
    for (Iterator iterator = tags.iterator(); iterator.hasNext();) { 
     Map.Entry tag = (Map.Entry) iterator.next(); 
     result.add(tag.getKey().toString()); 
    } 
    return result; 
} 

那么,有没有限制由TermsComponent返回的标签的方式,或者说我必须手动查询用户的所有标签,并自己过滤它们?

回答

7

根据Solr邮件列表中的thisthat发布,对术语组件进行过滤是不可能的,因为它对原始索引数据进行操作。

显然,Solr开发人员正在致力于支持您的过滤的real autosuggest component

根据您的要求,您可能可以使用faceting component for autocomplete而不是术语组件。它完全支持筛选查询,以将符合条件的标记集合缩减为索引中文档的子集。

+0

切面似乎确实有诀窍。非常感谢。 – 2011-03-10 12:33:46