Forums

Home » Liferay Portal » Español » 3. Desarrollo

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Jose Ignacio Honrado
Filtrar resultados lucene por rango de fechas
July 9, 2010 5:19 AM
Answer

Jose Ignacio Honrado

Rank: New Member

Posts: 11

Join Date: September 10, 2009

Recent Posts

Hola,

Tenemos nuestro propio portlet buscador que realiza búsquedas sobre los índices con nuestras propias condiciones y ordenaciones, mediante el método:

SearchEngineUtil.search(companyId, query, sort, start, end);

El problema es que no se puede añadir que restrinja los resultados mediante una condición Field.MODIFIED > fechaInicio (y el homologo con la fecha de fin).

Hemos estado investigando y hemos encontrado que en Lucene existen clases como RangeFilter, DateFilter, etc... pero que no están disponibles en Liferay. Hemos intentado crear nuestra propia clase RangeFilter pero sin éxito.

¿Alguna idea sobre como implementar esto?

Saludos
Jose Manuel del Aguila
RE: Filtrar resultados lucene por rango de fechas
July 9, 2010 8:02 AM
Answer

Jose Manuel del Aguila

Rank: New Member

Posts: 21

Join Date: May 31, 2010

Recent Posts

Hola Jose Ignacio,
estoy intentando hacer un portlet propio de busqueda tambien. Lo unico que quiero es poder filtrar donde quiero buscar(web content, document library...) y el resultado sacarlo con un marcado propio. Me podrias hechar una mano?
Gracias
Jose Ignacio Honrado
RE: Filtrar resultados lucene por rango de fechas
July 12, 2010 1:08 AM
Answer

Jose Ignacio Honrado

Rank: New Member

Posts: 11

Join Date: September 10, 2009

Recent Posts

Hola Jose Manuel,

Te dejo un ejemplo completo sobre como hacer lo que comentas:

 1
 2// Query que busca en el portal que deseemos
 3BooleanQuery contextQuery = BooleanQueryFactoryUtil.create();
 4contextQuery.addRequiredTerm(Field.COMPANY_ID, webId);
 5
 6// Query que busca que la cadena introducida por el usuairo está en uno de los campos principales
 7BooleanQuery searchQuery = BooleanQueryFactoryUtil.create();
 8searchQuery.addTerm(Field.TITLE, cadena);
 9searchQuery.addTerm(Field.DESCRIPTION, cadena);
10searchQuery.addTerm(Field.CONTENT, cadena);
11searchQuery.addTerm(Field.PROPERTIES, cadena);
12searchQuery.addTerm(Field.TAGS_ENTRIES, cadena, true);
13
14// Querypara buscador solo imágenes de la calería
15BooleanQuery IGQuery = BooleanQueryFactoryUtil.create();
16IGQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME,IGImage.class.getName());
17   
18// Creamos query completa para enlazar las demás obligando a que
19// el enlace sea un AND en lugar de un OR
20BooleanQuery fullQuery = BooleanQueryFactoryUtil.create();
21fullQuery.add(contextQuery, BooleanClauseOccur.MUST);
22fullQuery.add(searchQuery, BooleanClauseOccur.MUST);
23fullQuery.add(IGQuery , BooleanClauseOccur.MUST);
24
25// Añadimos ordenación (fecha descendente)
26Sort sort = new Sort();
27sort.setFieldName(Field.MODIFIED);
28sort.setType(Sort.LONG_TYPE);
29sort.setReverse(true);   
30
31// Ejecutamos la búsqueda
32SearchEngineUtil.search(companyId, fullQuery, sort, start, end);
33
34// Recorremos resultados
35for (int i=0; i<lista.getDocs().length; i++) {
36    ...
37}


Por último y tras mucho investigar, resulta que filtrar por fecha era una chorrada si usamos la sintáxis de Lucene en texto y la clase StringQueryImpl:

1
2// Las fechas están en formato YYYYMMDDHHMMSS
3String dateFilterStr = Field.MODIFIED + ":{20100712000000 TO 20100801235959}";
4StringQueryImpl dateFilter = new StringQueryImpl(dateFilterStr);
5fullQuery.add(dateFilter, BooleanClauseOccur.MUST);


Saludos
Jose Manuel del Aguila
RE: Filtrar resultados lucene por rango de fechas
July 12, 2010 4:09 AM
Answer

Jose Manuel del Aguila

Rank: New Member

Posts: 21

Join Date: May 31, 2010

Recent Posts

Hola Jose Ignacio,

Muchas gracias por tu ayuda me ha servido de mucho.
Para aquellos que quieran utilizar el código de Jose Ignacio y quiere buscar en otros sitios ha de substituir las linia 16 por:

Document Library
1IGQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, DLFileEntry.class.getName());


Calendar
1IGQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, CalEvent.class.getName());


WebContent
1IGQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, JournalArticle.class.getName());
Danny Chan
RE: Filtrar resultados lucene por rango de fechas
February 13, 2012 1:02 PM
Answer

Danny Chan

Rank: New Member

Posts: 1

Join Date: February 13, 2012

Recent Posts

Saludos Jose Ignacio

Estoy muy interesado en conocer a detalles como pudiste crear un buscador por rango de fecha, puesto que la empresa en la cual laboro utilizan Liferay y son nuevo con este CMS. He revisado el ejemplo que has colocado pero tengo la duda de donde insertar el mismo, puesto que el buscador apunta a un journal_search por metodo post.

Si me puedes guiar seria excelente. Gracias de antemano.
Pablo Antonio Zamora Ortiz
RE: Filtrar resultados lucene por rango de fechas
February 29, 2012 1:17 AM
Answer

Pablo Antonio Zamora Ortiz

Rank: Junior Member

Posts: 28

Join Date: March 18, 2011

Recent Posts

hola muchachos la verdad soy nuevo en esto pero quisiera pedirles ayuda ya que llevo varios días en esto y no he podido hacer lo que quiero me estaba guiando del portlets directory pero me enrede un poco con el código estoy intentando cargar los usuarios que están en una determinada organización pero a la ves quiero agregar el botón buscar pero no consigo que me tome los valores al momento de buscar lo que el usuario ingresa ahora no se como organizar la consulta para buscar el contenido de lo que el usuario escribe los pude listar pero no he podido lograr que busque aquí les muestro mi código y les pido una ayuda MUCHAS GRACIAS DE ANTEMANO.......
en el view jsp incluyo esta pagina
 1
 2
 3<%@include file="/WEB-INF/jsp/init.jsp"%>
 4
 5<%
 6
 7PortletURL portletURL = renderResponse.createRenderURL();
 8
 9portletURL.setParameter("struts_action", "/Alumnos/WEB-INF/jsp/Listar_Alumnos.jsp");
10portletURL.setParameter("tabs1", tabs1);
11
12pageContext.setAttribute("portletURL", portletURL);
13
14String portletURLString = portletURL.toString();
15
16request.setAttribute("view.jsp-portletURL", portletURL);
17request.setAttribute("view.jsp-portletURLString", portletURLString);
18String id = (String)request.getAttribute("id");
19
20List<Organization> organizationList = new ArrayList<Organization>();
21List<Organization> allOrganizations = OrganizationLocalServiceUtil.getOrganizations(0,OrganizationLocalServiceUtil.getOrganizationsCount());
22        for (Organization organization : allOrganizations) {
23                        organizationList.add(organization);
24        }      
25String nombre ="ALUMNOS";
26long idorganizacion = new Long(11);
27for (int j=0; j <organizationList.size(); ++j)
28    {
29        if(nombre.equals(organizationList.get(j).getName()))
30          {idorganizacion = organizationList.get(j).getOrganizationId();}      
31    }
32
33List<User> userl = (List) UserLocalServiceUtil.getOrganizationUsers(idorganizacion);
34
35  %>
36
37<%= id %>
38<form action="<portlet:actionURL/>" name="<portlet:namespace/>formid" method="post" >
39<input type="text" name="textid" value="${id}"></input>
40<input type="submit" name="Search" value="Search"/>
41</form>
42
43<liferay-ui:search-container delta="2" emptyResultsMessage="No-se-encontro-usuario" >
44   
45    <aui:input disabled="<%= true %>" name="usersRedirect" type="hidden" value="<%= portletURL.toString() %>" />
46   
47    <liferay-ui:search-container-results total="<%= userl.size() %>" results="<%= ListUtil.subList(userl,searchContainer.getStart(),searchContainer.getEnd())%>" />                                                   
48    <liferay-ui:search-container-row  className="com.liferay.portal.model.User" escapedModel="<%= true %>" modelVar="User" keyProperty="UserId">      
49            <liferay-ui:search-container-column-text orderable="<%= true %>" href="" name="Id. Del Alumno" value="<%= String.valueOf(userl.get(index).getUserId()) %>"/>          
50            <liferay-ui:search-container-column-text orderable="<%= true %>" href="" name="Nombre Del Alumno" value="<%= userl.get(index).getFullName() %>"/>
51            <liferay-ui:search-container-column-text orderable="<%= true %>" href="" name="Correo Electronico" value="<%= userl.get(index).getEmailAddress() %>" />
52        </liferay-ui:search-container-row>
53            <% searchContainer.setIteratorURL(portletURL);%>   
54  <div class="separator"><!-- --></div>
55
56  <liferay-ui:search-iterator searchContainer="<%= searchContainer %>" />
57   
58</liferay-ui:search-container>



y el .java trato de tomar los valores del boton search con

String id = ParamUtil.getString(request, "textid");
request.setAttribute("id", id);


pero no me lo permite les agradezco sus comentarios y si me explican como modifico este código y como puedo hacer la consulta gracias