java solr solrj

java - Filtrar y clasificar usando una función en solr



solrj (1)

Tengo documentos que se ven así:

{attr_a: 1}, {attr_a: 2, changes_user1_a: 3}

El segundo documento dice que el usuario1 realizó un cambio que aún no está "comprometido" y no es visible para otros usuarios.

Los campos son dinámicos:

<dynamicField name="changes_*" type="string" indexed="true" stored="true"/> <dynamicField name="attr_*" type="string" indexed="true" stored="true"/>

El problema es que el usuario 1 necesita filtrar, buscar y clasificar teniendo en cuenta sus nuevos valores, mientras que otros usuarios deben hacerlo en los valores anteriores.

Estaba pensando en resolver este problema de la siguiente manera: si user1 quiere filtrar y ordenar por attr_a, emitiría una consulta como

fq=def(changes_user1_a, attr_a): ''somefilter''&sort=def(changes_user1_a, attr_a) asc

Sin embargo, este enfoque genera el siguiente error para fq:

"error":{ "metadata":[ "error-class","org.apache.solr.common.SolrException", "root-error-class","org.apache.solr.parser.ParseException"], "msg":"org.apache.solr.search.SyntaxError: Cannot parse ''def(changes_user1_a, attr_a): 3'': Encountered /" /":/" /": /"/" at line 1, column 28./r/nWas expecting one of:/r/n <EOF> /r/n <AND> .../r/n <OR> .../r/n <NOT> .../r/n /"+/" .../r/n /"-/" .../r/n <BAREOPER> .../r/n /"(/" .../r/n /"*/" .../r/n /"^/" .../r/n <QUOTED> .../r/n <TERM> .../r/n <PREFIXTERM> .../r/n <WILDTERM> .../r/n <REGEXPTERM> .../r/n /"[/" .../r/n /"{/" .../r/n <LPARAMS> .../r/n /"filter(/" .../r/n <NUMBER> .../r/n ", "code":400}

Y al ordenar solo, este:

error":{ "trace":"java.lang.UnsupportedOperationException/r/n/tat org.apache.lucene.queries.function.FunctionValues.doubleVal(FunctionValues.java:47)/r/n/tat org.apache.lucene.queries.function.ValueSource$ValueSourceComparator.copy(ValueSource.java:153)/r/n/tat org.apache.lucene.search.TopFieldCollector$SimpleFieldCollector$1.collect(TopFieldCollector.java:206)/r/n/tat org.apache.lucene.search.MatchAllDocsQuery$1$1.score(MatchAllDocsQuery.java:56)/r/n/tat org.apache.lucene.search.BulkScorer.score(BulkScorer.java:39)/r/n/tat org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:669)/r/n/tat org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:473)/r/n/tat org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:260)/r/n/tat org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1810)/r/n/tat org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1627)/r/n/tat org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:643)/r/n/tat org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:529)/r/n/tat org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:293)/r/n/tat org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:156)/r/n/tat org.apache.solr.core.SolrCore.execute(SolrCore.java:2036)/r/n/tat org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:657)/r/n/tat org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:464)/r/n/tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:257)/r/n/tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:208)/r/n/tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668)/r/n/tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)/r/n/tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)/r/n/tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)/r/n/tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)/r/n/tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1160)/r/n/tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)/r/n/tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)/r/n/tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1092)/r/n/tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)/r/n/tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)/r/n/tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:119)/r/n/tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)/r/n/tat org.eclipse.jetty.server.Server.handle(Server.java:518)/r/n/tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)/r/n/tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:244)/r/n/tat org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)/r/n/tat org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)/r/n/tat org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)/r/n/tat org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:246)/r/n/tat org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:156)/r/n/tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)/r/n/tat org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)/r/n/tat java.lang.Thread.run(Thread.java:745)/r/n", "code":500}

Aunque fl=test:def(changes_user1_a, attr_a) funciona como era de esperar.

Entonces mis preguntas serían:

  1. ¿Estoy tomando el enfoque correcto para resolver este problema?
  2. En caso afirmativo, ¿por qué no puedo ordenar y filtrar con la función def?

Estoy usando Solr versión 6.1.0

Gracias


Para un filtro con una función , debe usar el analizador de frange . Ver por ejemplo: solr: Crear consulta de filtro con una función .

Por ejemplo, la siguiente consulta devolverá todos los documentos que tengan changes_user1_a=3 , o attr_a=3 si el campo changes_user1_a no existe.

fq={!frange u=3 l=3}def(changes_user1_a, attr_a)

Tu comando de clasificación me parece bien, pero aparentemente no funciona para los campos de cadena . Puedo reproducir tu excepción. Se ejecuta cuando ambos campos son numéricos. Tal vez error en Solr?

null:java.lang.UnsupportedOperationException at org.apache.lucene.queries.function.FunctionValues.doubleVal(FunctionValues.java:47) at org.apache.lucene.queries.function.valuesource.DefFunction$1.doubleVal(DefFunction.java:88) at org.apache.lucene.queries.function.ValueSource$ValueSourceComparator.copy(ValueSource.java:264) at org.apache.lucene.search.TopFieldCollector$SimpleFieldCollector$1.collect(TopFieldCollector.java:141) at org.apache.lucene.search.Weight$DefaultBulkScorer.scoreAll(Weight.java:246) at org.apache.lucene.search.Weight$DefaultBulkScorer.score(Weight.java:197) at org.apache.lucene.search.BulkScorer.score(BulkScorer.java:39) at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:669) at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:473) at org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:225) at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:2027) at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1844) at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:609) ...

Ver también:

  • Solr ordenar por el valor de la función de consulta no funciona
  • Apache Solr: ordena por uno de los campos (con condición)
  • ¿Cómo puedo ordenar las bases de resultados de solr en campos dinámicos?