7

SolrsTermsComponentを使用してオートコンプリート機能を実装しています。私のドキュメントには、「タグ」フィールドにインデックスを付けたタグが含まれています。これで、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によって返されるタグを制限する方法はありますか、それともユーザーのすべてのタグを手動でクエリして自分でフィルタリングする必要がありますか?

4

1 に答える 1

7

これとSolrメーリングリストの投稿によると、用語コンポーネントは生のインデックスデータで動作するため、フィルタリングはできませ

どうやら、Solr開発者は、フィルタリングをサポートする実際のオートサジェストコンポーネントに取り組んでいるようです。

要件によっては、用語コンポーネントの代わりにファセットコンポーネントをオートコンプリートに使用できる場合があります。適格なタグのセットをインデックス内のドキュメントのサブセットに減らすためのフィルタークエリを完全にサポートします。

于 2011-03-09T19:23:39.650 に答える