2016-10-21 5 views
0

私は関数照会の値のソートに依存している機能に取り組んでいます。関数照会の値によるSolrソートが機能しません。

機能クエリは以下の通りです:

http://localhost:8983/solr/collection/select?q=*:*&sort=if(exists(f1_t), f1_t, theme)+ASC&wt=json&indent=true 

ソート機能がある「if(exists(f1_t), f1_t, theme) ASC

だから、基本的に私は何をやっていることであるかのフィールドタイプのダイナミックな分野である「f1_t」( TextField)が存在する場合、ソートはフィールドの値に基づいています。ソートはTextFieldである "theme"の値に基づいています(ただし動的フィールドではありません)。

しかし、これを実行するとは失敗する以下の例外があります。 整数値で "if"関数を試してみましたがうまくいきます。 上記の関数クエリが失敗する理由を理解するのに役立つかどうか疑問に思っていましたか?これをどうやって動かすことができますか?私が使用している

のSolrバージョンは、私がIfFunction $ 1.doubleVal(IfFunction.java:83)ラインを見ていると私はケースが機能クエリ制限についてだと思い4.6.1

"trace": "java.lang.UnsupportedOperationException\n\tat 
org.apache.lucene.queries.function.FunctionValues.doubleVal(FunctionValues.java:47)\n\tat 
org.apache.lucene.queries.function.valuesource.IfFunction$1.doubleVal(IfFunction.java:83)\n\tat 
org.apache.lucene.queries.function.ValueSource$ValueSourceComparator.copy(ValueSource.java:152)\n\tat 
org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.collect(TopFieldCollector.java:86)\n\tat 
org.apache.lucene.search.Scorer.score(Scorer.java:65)\n\tat 
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:621)\n\tat 
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:297)\n\tat 
org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1529)\n\tat 
org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1395)\n\tat 
org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:474)\n\tat 
org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:438)\n\tat 
org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:208)\n\tat 
org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)\n\tat org.apache.solr.core.SolrCore.execute(SolrCore.java:1859)\n\tat 
org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:723)\n\tat 
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:419)\n\tat 
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:203)\n\tat 
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)\n\tat 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n\tat 
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)\n\tat 
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)\n\tat 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)\n\tat 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)\n\tat 
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)\n\tat 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)\n\tat 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n\tat 
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n\tat 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n\tat 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n\tat org.eclipse.jetty.server.Server.handle(Server.java:368)\n\tat 
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)\n\tat 
org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)\n\tat 
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:942)\n\tat 
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1004)\n\tat 
org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)\n\tat 
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n\tat 
org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)\n\tat 
org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)\n\tat 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)\n\tat 
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)\n\tat java.lang.Thread.run(Thread.java:662)\n", 
    "code": 500 
+0

をテキストフィールドでソートする場合を除き、機能しませんフィールドはキーワードになります。可能であれば、並べ替えにStrFieldを使用します。 – MatsLindh

+1

私はそれらをStrFieldに変更できますが、StrFieldを使用してこのソート機能を実現することは可能ですか?私はStrFieldを試して、同じ例外が発生しました – Bourne

+0

あなたの質問は[this](http://stackoverflow.com/questions/40307145/apache-solr-sort-by-one-of-fields-with-condition/40312415)に関連しています。だから質問。並べ替えが現在ルーケーンで構築されている方法では、倍精度の検索以外に何も使用できません。これは、ソート関数 'if(exists(firstname)、firstname、lastname)ascが機能しなくて、' FunctionValues#doubleVal(int) 'メソッドでsolrが' UnsupportedOperationException'を返す理由です。 –

答えて

0

です。

機能クエリは、一つ以上の数値フィールドの 実際の値を使ったスコアの関連性を生成することができます:1はFunction Query wikiで見ることができるように、それは数値フィールド上で動作することができます。

事前に使用するフィールドがわかっているので、この特定の問題はインデックス時に解決できます。つまり、値がかかりますフィールドをソート代理、作成:あなたが期待するようf1_tフィールドがthemeフィールドから

  • が存在する場合user_h1_tフィールドから

    • をそう
  • 関連する問題