我正在使用Solrs TermsComponent来实现自动完成功能。我的文档包含我在“标签”字段中编入索引的标签。现在,我可以使用TermsComponent找出所有存储文档中使用的标记。到目前为止,这非常有效。
但是还有一些额外的要求:每个文档都有一个owner字段,其中包含拥有它的用户的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;
}
那么有没有办法限制TermComponent返回的标签,还是我手动查询用户的所有标签并自行过滤?
答案 0 :(得分:7)
根据Solr邮件列表上的this和that帖子,无法过滤条款组件,因为它对原始索引数据进行操作。
显然,Solr开发人员正在开发支持您过滤的real autosuggest component。
根据您的要求,您可以使用faceting component for autocomplete代替条款组件。它完全支持筛选查询,以便将符合条件的标记集减少到索引中文档的子集。