2011-03-09 12 views
7

Estoy usando Solrs TermsComponent para implementar una característica de autocompletar. Mis documentos contienen etiquetas que he indexado en un campo de "etiquetas". Ahora puedo usar TermsComponent para descubrir qué etiquetas se usan en todos los documentos almacenados. Esto funciona bastante bien hasta ahora.Límite de términos en términos de Solr Componente a términos que se originan de ciertos documentos

Sin embargo, existe un requisito adicional: cada documento tiene un campo propietario que contiene el ID del usuario que lo posee. La lista de autocompletar solo debe contener etiquetas de documentos, que el usuario que está solicitando el autocompletar es el propietario.

He tratado de establecer el parámetro de consulta, sin embargo, esto parece ser ignorado por el 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; 
} 

Entonces, ¿hay una manera de limitar las etiquetas devueltas por TermsComponent, o tengo manualmente para consultar todas las etiquetas del usuario y las filtro yo mismo?

Respuesta

7

De acuerdo con this y that publicar en la lista de correo de Solr, no es posible filtrar en los términos del componente porque opera en datos de índice sin formato.

Aparentemente, los desarrolladores de Solr están trabajando en un real autosuggest component que admite su filtrado.

Según sus requisitos, es posible que pueda utilizar el componente faceting component for autocomplete en lugar de los términos. Es totalmente compatible con las consultas de filtro para reducir el conjunto de etiquetas elegibles a un subconjunto de los documentos en el índice.

+0

Faceting parece ser el verdadero truco. Muchas gracias. –

Cuestiones relacionadas