7

我正在使用 Solrs 术语组件来实现自动完成功能。我的文档包含我在“标签”字段中编制索引的标签。现在我可以使用 TermsComponent 找出所有存储的文档中使用了哪些标签。到目前为止,这工作得很好。

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

我试图设置查询参数,但是这似乎被条款组件忽略了:

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返回的标签,还是我必须手动查询用户的所有标签并自己过滤它们?

4

1 回答 1

7

根据Solr 邮件列表上的这个那个帖子,不可能对术语组件进行过滤,因为它对原始索引数据进行操作。

显然,Solr 开发人员正在开发一个真正的自动建议组件来支持您的过滤。

根据您的要求,您也许可以使用faceting 组件而不是 terms 组件来自动完成。它完全支持过滤器查询,用于将符合条件的标签集减少到索引中文档的子集。

于 2011-03-09T19:23:39.650 回答