Javaを使用して、関心のある既知のIDのセット内にIDを持つ結果をSolrサーバーに照会しています。
私が興味を持っているこれらの結果だけを取得するために考えることができる最善の方法は、次のような長いクエリ文字列を作成することでした。
q=(item_id:XXX33-3333 OR item_id:YYY42-3445 OR item_id:JFDE-3838)
リクエストを行う前に、この文字列queryString
を生成します。最終的に作成したいリクエストには、1500を超えるそのようなIDが含まれています。 HTTP POSTを使用して、クエリを次のように作成しています。
HttpPost post = new HttpPost(url);
post.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
StringEntity entity = new StringEntity(queryString, "UTF-8");
entity.setContentType("application/x-www-form-urlencoded; charset=utf-8");
post.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
クエリを最初の1000IDのみに制限すると、クエリは成功し、期待どおりの結果が返されます。ただし、クエリを増やして、本当に関心のある1500をすべて含めると、HTTP400応答コードが次のエラーで表示されます。
HTTP/1.1 400 org.Apache.lucene.queryParser.ParseException: Cannot parse '[my query here...]
Solrクエリで一緒にORできるIDの数に制限はありますか?1000を超えたときにこれが失敗する可能性がある別の理由がありますか?実験しましたが、周りで失敗します1024(私のIDはすべてほぼ同じ長さです)なので、文字または用語の制限があることを示唆しているようです。
または、私が探しているアイテムを別のよりスマートな方法で取得する方法について誰かが良い提案をしている場合は、それを聞いてみたいと思います。私のバックアップソリューションは、Solrにallアイテムをクエリし、結果を解析して、関心のあるセットに属するアイテムを使用することです。データソースが可能であるため、これは行いたくありません。何万ものアイテムがあり、非効率的です。
Solr側に制限はありません。クエリで数万のIDを使用して、同様の方法でSolrを定期的に使用します。
サーブレットコンテナ(Tomcat、Jettyなど)の設定を確認し、最大値POSTサイズを増やす必要があります。Tomcatを使用している場合はmaxPostSize
を、Jettyを使用している場合はmaxFormContentSize
を検索してください。
Solr 6.0の時点で、Solr内にmaxBooleanClauses
構成があります-デフォルトは1024です。
制限を確認するために単体テストを作成しました(Solr 5.3を使用)。
詳細はこちら https://wiki.Apache.org/solr/SolrConfigXml#The_Query_Section
FWIWは、将来削除される可能性があるため、削除するためのオープンなSolr JIRAがあります https://issues.Apache.org/jira/browse/SOLR-4586