2013-04-24 16 views
9

Używam języka Java do wysyłania zapytań do serwera SOLR w celu uzyskania wyników z identyfikatorami w zestawie znanych identyfikatorów, które mnie interesują.Czy istnieje limit rozmiaru lub terminu dla ciągu zapytania SOLR podczas korzystania z protokołu HTTP POST?

Najlepszym sposobem, w jaki mógłbym myśleć o uzyskaniu tych wyników, którymi jestem zainteresowany, był stworzyć długi ciąg kwerendy, który wygląda mniej więcej tak:

q=(item_id:XXX33-3333 OR item_id:YYY42-3445 OR item_id:JFDE-3838)

wygenerować ten ciąg, queryString, przed podjęciem moją prośbę, a jest ich ponad 1500 takie identyfikatory zawarte we wniosku Chciałbym w końcu jak zrobić . Używam HTTP POST, aby kwerendę jako takie:

 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); 

Gdybym ograniczyć zapytanie do tylko pierwsze 1000 identyfikatory, uda i uzyskać wyniki z powrotem jak bym się spodziewał. Jednakże, jeśli mogę zwiększyć zapytanie do obejmują cały 1500, że jestem bardzo zainteresowany, otrzymuję HTTP 400 kod odpowiedzi z powodu następującego błędu:

HTTP/1.1 400 org.apache.lucene.queryParser.ParseException: Cannot parse '[my query here...]

Czy istnieje ograniczenie liczby identyfikatorów, że może LUB razem w zapytaniu SOLR? Czy jest inny powód, który może się nie udać, gdy przekroczę 1000? Eksperymentowałem i zakończyło się to niepowodzeniem około 1024 (moje identyfikatory są prawie tej samej długości), więc wydaje się sugerować, że istnieje limit znaków lub terminu.

Lub, jeśli ktoś ma dobrą sugestię, w jaki sposób mogę uzyskać przedmioty, których szukam w inny, mądrzejszy sposób, chciałbym to usłyszeć. Moje rozwiązanie do tworzenia kopii zapasowych jest po prostu zapytaniem o SOLR dla wszystkich pozycji, przeanalizowanie wyników i użycie tych, które należą do zestawu, który mnie interesuje. Wolałbym tego nie robić, ponieważ źródło danych mogłoby mieć dziesiątki tysięcy przedmiotów, a to byłoby nieefektywne.

Odpowiedz

16

Po stronie Solr nie ma żadnych ograniczeń - regularnie używamy Solr w podobny sposób z dziesiątkami tysięcy identyfikatorów w zapytaniu.

Należy przyjrzeć się ustawieniom kontenera serwletu (Tomcat, Jetty itp.) I zwiększyć maksymalny rozmiar POST. Jeśli używasz programu Tomcat i maxFormContentSize, wyszukaj numer maxPostSize.

+0

Dzięki! Wygląda na to, że to prawdopodobnie powód. To miałoby idealny sens. Niestety istnieje inny zespół pracujący nad stroną SOLR i nie mam do niego dostępu, więc nie mogę go od razu przetestować. Będę musiał sprawdzić, czy mogę kogoś zmienić. Zamierzam iść dalej i zaakceptować twoją odpowiedź, ponieważ myślę, że to brzmi dobrze. Przekażę raport, czy to działa dla mnie, czy nie. – mattgmg1990

+0

@ nikhil500 Zastanawiam się, jak wykonać żądanie w domenie krzyżowej w SOLR z ciągłym ciągiem zapytania? Próbowałem przesłać żądanie z JSONP, ale powiedziano, że JSONP opiera się również na GET, co ogranicza długość zapytania, czy możesz w tym pomóc? – Kuan