Foros de discusión

Filtrar resultados lucene por rango de fechas

thumbnail
Jose Ignacio Honrado, modificado hace 13 años.

Filtrar resultados lucene por rango de fechas

New Member Mensajes: 11 Fecha de incorporación: 10/09/09 Mensajes recientes
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, modificado hace 13 años.

RE: Filtrar resultados lucene por rango de fechas

New Member Mensajes: 21 Fecha de incorporación: 31/05/10 Mensajes recientes
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
thumbnail
Jose Ignacio Honrado, modificado hace 13 años.

RE: Filtrar resultados lucene por rango de fechas

New Member Mensajes: 11 Fecha de incorporación: 10/09/09 Mensajes recientes
Hola Jose Manuel,

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


// Query que busca en el portal que deseemos
BooleanQuery contextQuery = BooleanQueryFactoryUtil.create();
contextQuery.addRequiredTerm(Field.COMPANY_ID, webId);

// Query que busca que la cadena introducida por el usuairo está en uno de los campos principales
BooleanQuery searchQuery = BooleanQueryFactoryUtil.create();
searchQuery.addTerm(Field.TITLE, cadena);
searchQuery.addTerm(Field.DESCRIPTION, cadena);
searchQuery.addTerm(Field.CONTENT, cadena);
searchQuery.addTerm(Field.PROPERTIES, cadena);
searchQuery.addTerm(Field.TAGS_ENTRIES, cadena, true);

// Querypara buscador solo imágenes de la calería
BooleanQuery IGQuery = BooleanQueryFactoryUtil.create();
IGQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME,IGImage.class.getName());
	
// Creamos query completa para enlazar las demás obligando a que 
// el enlace sea un AND en lugar de un OR
BooleanQuery fullQuery = BooleanQueryFactoryUtil.create();
fullQuery.add(contextQuery, BooleanClauseOccur.MUST);
fullQuery.add(searchQuery, BooleanClauseOccur.MUST);
fullQuery.add(IGQuery , BooleanClauseOccur.MUST);

// Añadimos ordenación (fecha descendente)
Sort sort = new Sort();
sort.setFieldName(Field.MODIFIED);
sort.setType(Sort.LONG_TYPE);
sort.setReverse(true);	

// Ejecutamos la búsqueda
SearchEngineUtil.search(companyId, fullQuery, sort, start, end);

// Recorremos resultados
for (int i=0; i<lista.getdocs().length; i++) { ... } < code></lista.getdocs().length;>
<br><br>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:<br><br><pre><code> // Las fechas están en formato YYYYMMDDHHMMSS String dateFilterStr = Field.MODIFIED + ":{20100712000000 TO 20100801235959}"; StringQueryImpl dateFilter = new StringQueryImpl(dateFilterStr); fullQuery.add(dateFilter, BooleanClauseOccur.MUST); </code></pre><br><br>Saludos
Jose Manuel del Aguila, modificado hace 13 años.

RE: Filtrar resultados lucene por rango de fechas

New Member Mensajes: 21 Fecha de incorporación: 31/05/10 Mensajes recientes
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
IGQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, DLFileEntry.class.getName());


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


WebContent
IGQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, JournalArticle.class.getName());
Danny Chan, modificado hace 12 años.

RE: Filtrar resultados lucene por rango de fechas

New Member Mensaje: 1 Fecha de incorporación: 13/02/12 Mensajes recientes
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.
thumbnail
Pablo Antonio Zamora Ortiz, modificado hace 12 años.

RE: Filtrar resultados lucene por rango de fechas

Junior Member Mensajes: 28 Fecha de incorporación: 18/03/11 Mensajes recientes
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


&lt;%@include file="/WEB-INF/jsp/init.jsp"%&gt;

&lt;%

PortletURL portletURL = renderResponse.createRenderURL();

portletURL.setParameter("struts_action", "/Alumnos/WEB-INF/jsp/Listar_Alumnos.jsp");
portletURL.setParameter("tabs1", tabs1);

pageContext.setAttribute("portletURL", portletURL);

String portletURLString = portletURL.toString();

request.setAttribute("view.jsp-portletURL", portletURL);
request.setAttribute("view.jsp-portletURLString", portletURLString);
String id = (String)request.getAttribute("id");

List<organization> organizationList = new ArrayList<organization>();
List<organization> allOrganizations = OrganizationLocalServiceUtil.getOrganizations(0,OrganizationLocalServiceUtil.getOrganizationsCount());
        for (Organization organization : allOrganizations) {
                        organizationList.add(organization);
        }      
String nombre ="ALUMNOS";
long idorganizacion = new Long(11);
for (int j=0; j <organizationlist.size(); ++j) { if(nombre.equals(organizationlist.get(j).getname())) {idorganizacion="organizationList.get(j).getOrganizationId();}" } list<user> userl = (List) UserLocalServiceUtil.getOrganizationUsers(idorganizacion);

  %&gt; 

&lt;%= id %&gt;
<form action="<portlet:actionURL/>" name="<portlet:namespace/>formid" method="post">
<input type="text" name="textid" value="${id}">
<input type="submit" name="Search" value="Search">
</form>

<liferay-ui:search-container delta="2" emptyresultsmessage="No-se-encontro-usuario">
   
    <aui:input disabled="<%= true %>" name="usersRedirect" type="hidden" value="<%= portletURL.toString() %>" />
    
    <liferay-ui:search-container-results total="<%= userl.size() %>" results="<%= ListUtil.subList(userl,searchContainer.getStart(),searchContainer.getEnd())%>" />                                                   
    <liferay-ui:search-container-row classname="com.liferay.portal.model.User" escapedmodel="<%= true %>" modelvar="User" keyproperty="UserId">       
            <liferay-ui:search-container-column-text orderable="<%= true %>" href="" name="Id. Del Alumno" value="<%= String.valueOf(userl.get(index).getUserId()) %>" />           
            <liferay-ui:search-container-column-text orderable="<%= true %>" href="" name="Nombre Del Alumno" value="<%= userl.get(index).getFullName() %>" />
            <liferay-ui:search-container-column-text orderable="<%= true %>" href="" name="Correo Electronico" value="<%= userl.get(index).getEmailAddress() %>" />
        </liferay-ui:search-container-row>
            &lt;% searchContainer.setIteratorURL(portletURL);%&gt;   
  <div class="separator"><!-- --></div>

  <liferay-ui:search-iterator searchContainer="<%= searchContainer %>" />
    
</liferay-ui:search-container>

</organizationlist.size();></organization></organization></organization>



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