Jedną ze zmiennych konfiguracyjnych, jakie znajdują się w pliku solrconfig.xml jest maxBooleanClauses, która określa maksymalną ilość zapytań boolowskich jaka może być zwarta w ramach pojedynczego zapytania do Solr. Czy muszę uważać na limit związany z tą zmienną korzystając z filtrów w Solr ? Spróbujmy odpowiedź na to pytanie nie wgłębiając się w kod Lucene i Solr.
Załóżmy, że standardowo zadawaliśmy następujące zapytanie do Solr:
q=category:1 AND category:2 AND category:3 ... AND category:2000
Zadanie takiego zapytania z domyślną konfiguracją Solr będzie skutkowało wyjątkiem i komunikatem „too many boolean clauses„. Oczywiście, moglibyśmy zmodyfikować opcję maxBooleanClauses i pozbyć się wyjątku, jednak spróbujmy zrobić to w inny sposób:
Zmieńmy zapytanie na filtry
Zmieńmy zatem powyższe zapytanie tak, aby wykorzystywało filtry, czyli parametr fq:
q=*:*&fq=category:(1 2 3 ... 2000)
Wysyłamy powyższe zapytanie i … i znów to samo – wyjątek i komunikat „too many boolean clauses„. Dzieje się tak dlatego, iż Solr musi „wyliczyć” zawartość filtra, a co za tym idzie skonstruować odpowiednie zapytanie. Dokonajmy zatem jeszcze jednej modyfikacji:
Kolejna modyfikacja zapytania
Niech nasze zapytanie wygląda w takim wypadku w następujący sposób:
q=*:*&fq=category:1&fq=category:2&fq=category:3&....&fq=category:2000
Po wysłaniu zmodyfikowanego zapytania naszym oczom ukażą się wyniki wyszukiwania (oczywiście, jeżeli w indeksie znajdują się dokumenty odpowiadające warunkom w zapytaniu). Tym razem Solr nie musiał składać jednego dużego zapytania, dlatego też nie przekroczyliśmy limitu związanego z maxBooleanClauses.
Podsumowanie
Jak widać odpowiedź na pytanie zależy od tego, jakie zapytanie chcemy, bądź musimy zadać. W przypadku, kiedy nasze warunki łączy operator logiczny AND możemy pozwolić sobie na zmianę zapytania na wiele parametrów fq ponieważ Solr łączy je automatycznie właśnie tym spójnikiem. Jeżeli natomiast zmuszeni jesteśmy stosować spójnik logiczny OR czekałaby nas zmiana limitu wyznaczonego przez maxBooleanClauses. Należy przy tym pamiętać, iż zwiększanie tego limitu może pociągnąć za sobą spadek wydajności i zwiększone wykorzystanie pamięci.
Załóżmy, że standardowo zadawaliśmy następujące zapytanie do Solr:
q=category:1 AND category:2 AND category:3 ... AND category:2000
Zadanie takiego zapytania z domyślną konfiguracją Solr będzie skutkowało wyjątkiem i komunikatem „too many boolean clauses„. Oczywiście, moglibyśmy zmodyfikować opcję maxBooleanClauses i pozbyć się wyjątku, jednak spróbujmy zrobić to w inny sposób:
Zmieńmy zapytanie na filtry
Zmieńmy zatem powyższe zapytanie tak, aby wykorzystywało filtry, czyli parametr fq:
q=*:*&fq=category:(1 2 3 ... 2000)
Wysyłamy powyższe zapytanie i … i znów to samo – wyjątek i komunikat „too many boolean clauses„. Dzieje się tak dlatego, iż Solr musi „wyliczyć” zawartość filtra, a co za tym idzie skonstruować odpowiednie zapytanie. Dokonajmy zatem jeszcze jednej modyfikacji:
Kolejna modyfikacja zapytania
Niech nasze zapytanie wygląda w takim wypadku w następujący sposób:
q=*:*&fq=category:1&fq=category:2&fq=category:3&....&fq=category:2000
Po wysłaniu zmodyfikowanego zapytania naszym oczom ukażą się wyniki wyszukiwania (oczywiście, jeżeli w indeksie znajdują się dokumenty odpowiadające warunkom w zapytaniu). Tym razem Solr nie musiał składać jednego dużego zapytania, dlatego też nie przekroczyliśmy limitu związanego z maxBooleanClauses.
Podsumowanie
Jak widać odpowiedź na pytanie zależy od tego, jakie zapytanie chcemy, bądź musimy zadać. W przypadku, kiedy nasze warunki łączy operator logiczny AND możemy pozwolić sobie na zmianę zapytania na wiele parametrów fq ponieważ Solr łączy je automatycznie właśnie tym spójnikiem. Jeżeli natomiast zmuszeni jesteśmy stosować spójnik logiczny OR czekałaby nas zmiana limitu wyznaczonego przez maxBooleanClauses. Należy przy tym pamiętać, iż zwiększanie tego limitu może pociągnąć za sobą spadek wydajności i zwiększone wykorzystanie pamięci.