After a bit of digging: the error message in the exception is a bit misleading, but what really happens is that the code cannot load the org.apache.solr.handler.clustering.carrot2.LuceneCarrot2TokenizerFactory class. The class is being loaded by Carrot2 code ( https://github.com/carrot2/carrot2/blob/master/core/carrot2-util-common/src/org/carrot2/util/ReflectionUtils.java#L47), which doesn't seem to play well with how Solr loads classes. We'll be looking for ways to properly fix it, any hints would be helpful.
Meanwhile, a quick and dirty way of fixing the config would be to make the clustering component and Carrot2 JARs available to the context classloader by copying them to WEB-INF/lib of the WAR. Staszek On Sun, May 20, 2012 at 6:16 PM, Stanislaw Osinski < stanislaw.osin...@carrotsearch.com> wrote: > Interesting... let me investigate. > > S. > > > On Sun, May 20, 2012 at 5:15 PM, Koji Sekiguchi <k...@r.email.ne.jp>wrote: > >> Hi Staszek, >> >> Thank you for the fix so quickly! >> >> As a trial, I set: >> >> <str name="PreprocessingPipeline.**tokenizerFactory">org.apache.** >> solr.handler.clustering.**carrot2.**LuceneCarrot2TokenizerFactory<**/str> >> >> then I could start Solr without error. But when I make a request: >> >> http://localhost:8983/solr/**clustering?q=*%3A*&version=2.** >> 2&start=0&rows=10&indent=on&**wt=json&fl=id&carrot.**produceSummary=false<http://localhost:8983/solr/clustering?q=*%3A*&version=2.2&start=0&rows=10&indent=on&wt=json&fl=id&carrot.produceSummary=false> >> >> I got an exception: >> >> org.apache.solr.common.**SolrException: Carrot2 clustering failed >> at org.apache.solr.handler.**clustering.carrot2.** >> CarrotClusteringEngine.**cluster(**CarrotClusteringEngine.java:**224) >> at org.apache.solr.handler.**clustering.** >> ClusteringComponent.process(**ClusteringComponent.java:91) >> at org.apache.solr.handler.**component.SearchHandler.** >> handleRequestBody(**SearchHandler.java:186) >> at org.apache.solr.handler.**RequestHandlerBase.**handleRequest(** >> RequestHandlerBase.java:129) >> at org.apache.solr.core.**RequestHandlers$** >> LazyRequestHandlerWrapper.**handleRequest(RequestHandlers.**java:244) >> at org.apache.solr.core.SolrCore.**execute(SolrCore.java:1376) >> at org.apache.solr.servlet.**SolrDispatchFilter.execute(** >> SolrDispatchFilter.java:365) >> at org.apache.solr.servlet.**SolrDispatchFilter.doFilter(** >> SolrDispatchFilter.java:260) >> at org.mortbay.jetty.servlet.**ServletHandler$CachedChain.** >> doFilter(ServletHandler.java:**1212) >> at org.mortbay.jetty.servlet.**ServletHandler.handle(** >> ServletHandler.java:399) >> at org.mortbay.jetty.security.**SecurityHandler.handle(** >> SecurityHandler.java:216) >> at org.mortbay.jetty.servlet.**SessionHandler.handle(** >> SessionHandler.java:182) >> at org.mortbay.jetty.handler.**ContextHandler.handle(** >> ContextHandler.java:766) >> at org.mortbay.jetty.webapp.**WebAppContext.handle(** >> WebAppContext.java:450) >> at org.mortbay.jetty.handler.**ContextHandlerCollection.**handle(* >> *ContextHandlerCollection.java:**230) >> at org.mortbay.jetty.handler.**HandlerCollection.handle(** >> HandlerCollection.java:114) >> at org.mortbay.jetty.handler.**HandlerWrapper.handle(** >> HandlerWrapper.java:152) >> at org.mortbay.jetty.Server.**handle(Server.java:326) >> at org.mortbay.jetty.**HttpConnection.handleRequest(** >> HttpConnection.java:542) >> at org.mortbay.jetty.**HttpConnection$RequestHandler.** >> headerComplete(HttpConnection.**java:928) >> at org.mortbay.jetty.HttpParser.**parseNext(HttpParser.java:549) >> at org.mortbay.jetty.HttpParser.**parseAvailable(HttpParser.** >> java:212) >> at org.mortbay.jetty.**HttpConnection.handle(** >> HttpConnection.java:404) >> at org.mortbay.jetty.bio.**SocketConnector$Connection.** >> run(SocketConnector.java:228) >> at org.mortbay.thread.**QueuedThreadPool$PoolThread.** >> run(QueuedThreadPool.java:582) >> Caused by: org.carrot2.core.**ComponentInitializationExcepti**on: >> org.carrot2.util.attribute.**AttributeBindingException: Could not assign >> field org.carrot2.text.**preprocessing.pipeline.** >> CompletePreprocessingPipeline#**tokenizerFactory with value >> org.apache.solr.handler.**clustering.carrot2.** >> LuceneCarrot2TokenizerFactory >> at sun.reflect.**NativeConstructorAccessorImpl.**newInstance0(Native >> Method) >> at sun.reflect.**NativeConstructorAccessorImpl.**newInstance(** >> NativeConstructorAccessorImpl.**java:39) >> at sun.reflect.**DelegatingConstructorAccessorI**mpl.newInstance(* >> *DelegatingConstructorAccessorI**mpl.java:27) >> at java.lang.reflect.Constructor.**newInstance(Constructor.java:** >> 513) >> at org.carrot2.util.**ExceptionUtils.wrapAs(** >> ExceptionUtils.java:63) >> at org.carrot2.core.**PoolingProcessingComponentMana**ger$** >> ComponentInstantiationListener**.objectInstantiated(** >> PoolingProcessingComponentMana**ger.java:234) >> at org.carrot2.core.**PoolingProcessingComponentMana**ger$** >> ComponentInstantiationListener**.objectInstantiated(** >> PoolingProcessingComponentMana**ger.java:169) >> at org.carrot2.util.pool.**SoftUnboundedPool.**borrowObject(** >> SoftUnboundedPool.java:83) >> at org.carrot2.core.**PoolingProcessingComponentMana**ger.prepare( >> **PoolingProcessingComponentMana**ger.java:128) >> at org.carrot2.core.Controller.**process(Controller.java:333) >> at org.carrot2.core.Controller.**process(Controller.java:240) >> at org.apache.solr.handler.**clustering.carrot2.** >> CarrotClusteringEngine.**cluster(**CarrotClusteringEngine.java:**220) >> ... 24 more >> Caused by: org.carrot2.util.attribute.**AttributeBindingException: Could >> not assign field org.carrot2.text.**preprocessing.pipeline.** >> CompletePreprocessingPipeline#**tokenizerFactory with value >> org.apache.solr.handler.**clustering.carrot2.** >> LuceneCarrot2TokenizerFactory >> at org.carrot2.util.attribute.**AttributeBinder$** >> AttributeBinderActionBind.**performAction(AttributeBinder.**java:614) >> at org.carrot2.util.attribute.**AttributeBinder.bind(** >> AttributeBinder.java:311) >> at org.carrot2.util.attribute.**AttributeBinder.bind(** >> AttributeBinder.java:349) >> at org.carrot2.util.attribute.**AttributeBinder.bind(** >> AttributeBinder.java:219) >> at org.carrot2.util.attribute.**AttributeBinder.set(** >> AttributeBinder.java:149) >> at org.carrot2.util.attribute.**AttributeBinder.set(** >> AttributeBinder.java:129) >> at org.carrot2.core.**ControllerUtils.init(** >> ControllerUtils.java:50) >> at org.carrot2.core.**PoolingProcessingComponentMana**ger$** >> ComponentInstantiationListener**.objectInstantiated(** >> PoolingProcessingComponentMana**ger.java:189) >> ... 30 more >> Caused by: java.lang.**IllegalArgumentException: Can not set >> org.carrot2.text.linguistic.**ITokenizerFactory field org.carrot2.text.** >> preprocessing.pipeline.**BasicPreprocessingPipeline.**tokenizerFactory >> to java.lang.String >> at sun.reflect.**UnsafeFieldAccessorImpl.** >> throwSetIllegalArgumentExcepti**on(UnsafeFieldAccessorImpl.**java:146) >> at sun.reflect.**UnsafeFieldAccessorImpl.** >> throwSetIllegalArgumentExcepti**on(UnsafeFieldAccessorImpl.**java:150) >> at sun.reflect.**UnsafeObjectFieldAccessorImpl.**set(** >> UnsafeObjectFieldAccessorImpl.**java:63) >> at java.lang.reflect.Field.set(**Field.java:657) >> at org.carrot2.util.attribute.**AttributeBinder$** >> AttributeBinderActionBind.**performAction(AttributeBinder.**java:610) >> ... 37 more >> >> >> I should dig in, but if you have any clue, it would be appreciated. I'm >> using 3.6 branch. >> >> >> koji >> -- >> Query Log Visualizer for Apache Solr >> http://soleami.com/ >> >> (12/05/20 21:11), Stanislaw Osinski wrote: >> >>> Hi Koji, >>> >>> It's fixed in trunk and 3.6.1 branch now. If you hit any other issues >>> with >>> this, let me know. >>> >>> Staszek >>> >>> On Sun, May 20, 2012 at 1:02 PM, Koji Sekiguchi<k...@r.email.ne.jp> >>> wrote: >>> >>> Hi Staszek, >>>> >>>> I'll wait your fix. Thank you! >>>> >>>> Koji Sekiguchi from iPad2 >>>> >>>> On 2012/05/20, at 18:18, Stanislaw Osinski<stanis...@osinski.name**> >>>> wrote: >>>> >>>> Hi Koji, >>>>> >>>>> You're right, the current code overwrites the custom tokenizer though >>>>> it >>>>> shouldn't. LuceneCarrot2TokenizerFactory is there to avoid circular >>>>> dependencies (Carrot2 default tokenizer depends on Lucene), but it >>>>> shouldn't be an issue with custom tokenizers. >>>>> >>>>> I'll try to commit a fix later today. Meanwhile, if you have a chance >>>>> to >>>>> recompile the code, a temporary solution would be to hardcode your >>>>> tokenizer class into the fragment you pasted: >>>>> >>>>> BasicPreprocessingPipelineDesc**riptor.attributeBuilder(** >>>>> initAttributes) >>>>> .stemmerFactory(**LuceneCarrot2StemmerFactory.**class) >>>>> .tokenizerFactory(**YourCustomTokenizer.class) >>>>> .lexicalDataFactory(**SolrStopwordsCarrot2LexicalDat** >>>>> aFactory.class); >>>>> >>>>> Staszek >>>>> >>>>> On Sun, May 20, 2012 at 9:40 AM, Koji Sekiguchi<k...@r.email.ne.jp> >>>>> >>>> wrote: >>>> >>>>> >>>>> Hello, >>>>>> >>>>>> As I'd like to use custom ITokenizerFactory, I set the following >>>>>> Carrot2 >>>>>> key >>>>>> in solrconfig.xml: >>>>>> >>>>>> <searchComponent name="clustering" >>>>>> enable="${solr.clustering.**enabled:true}" >>>>>> class="solr.clustering.**ClusteringComponent"> >>>>>> <lst name="engine"> >>>>>> <str name="name">default</str> >>>>>> : >>>>>> <str >>>>>> >>>>>> name="PreprocessingPipeline.**tokenizerFactory">my.own.** >>>> TokenizerFactory</str> >>>> >>>>> </lst> >>>>>> </searchComponent> >>>>>> >>>>>> But seems that CarrotClusteringEngine overwrites it with >>>>>> LuceneCarrot2TokenizerFactory >>>>>> in init() method: >>>>>> >>>>>> BasicPreprocessingPipelineDesc**riptor.attributeBuilder(** >>>>>> initAttributes) >>>>>> .stemmerFactory(**LuceneCarrot2StemmerFactory.**class) >>>>>> .tokenizerFactory(**LuceneCarrot2TokenizerFactory.**class) >>>>>> .lexicalDataFactory(**SolrStopwordsCarrot2LexicalDat** >>>>>> aFactory.class); >>>>>> >>>>>> Am I missing something? >>>>>> >>>>>> koji >>>>>> -- >>>>>> Query Log Visualizer for Apache Solr >>>>>> http://soleami.com/ >>>>>> >>>>>> >>>> >>> >> >