I've sometimes seen this handled by clever tokenizing. For "Bill Rogers", index (untokenized) something like Bill|Bill Rogers Rogers|Bill Rogers
Your suggester then is a simple term lookup (see TermsComponent) which is quite fast. What you _don't_ get is autocorrect. But if you use terms.prefix, you can also control whether it's whole word match or not. To get whole-word in the above, you would set your prefix to "Rogers|" for instance. Or you may want to leave off the "|" to see more of an autocomplete-type response. Then, of course, when you display this you need to only display what's after the "|" (or whatever delimiter you use). One other note, this will be case sensitive, so you probably want to do casing yourself, index things like rogers|Bill Rogers and lowercase what you send in to terms component. Best, Erick On Tue, Sep 24, 2013 at 2:01 PM, JMill <apprentice...@googlemail.com> wrote: > Hi, > > I'm using Solr's Suggester function to implement an autocomplete feature. > I have it setup to check against the "username" and "name" fields. Problem > is when running a query against the name, the second term, after > whitespace (surename) returns 0 results. Works if if query is a partial > name starting from the begining e.g. Given the name "Bill Rogers", a query > for Rogers will return 0 results whereas a query for "Bill" will return > positive (Bill Rogers). As for the username, it's not working at. > > I am after the following behaviour. > > Match any partial words in the fields "username" or "name" and return the > results. If there is match in the field "name" the return the whole name > e.g. given the queries "Rogers" or "Bill"" return "Bill Rogers (not the > single word that was a match)". > > schema.xml extract > .. > <field name="username" type="text_general" indexed="true" stored="true" /> > <field name="name" type="text_general" indexed="true" stored="true"/> > <field name="autocomplete" type="textSpell" indexed="true" stored="false" > multiValued="true" omitNorms="true" omitTermFreqAndPositions="false" /> > ... > <copyField source="username" dest="autocomplete"/> > <copyField source="name" dest="autocomplete"/> > ... > > <fieldType class="solr.TextField" name="textSpell" > positionIncrementGap="100"> > <analyzer> > <tokenizer class="solr.StandardTokenizerFactory"/> > <filter class="solr.StandardFilterFactory"/> > <filter class="solr.LowerCaseFilterFactory"/> > </analyzer> > </fieldType> > > > solrconfig.xml > > .... > <lst name="spellchecker"> > <str name="name">suggest</str> > <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> > <str > name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> > <str name="field">autocomplete</str> <!-- the indexed field to derive > suggestions from --> > <float name="threshold">0.005</float> > <str name="buildOnCommit">true</str> > <!-- > <str name="sourceLocation">american-english</str> > --> > </lst> > > </searchComponent> > > .. > <requestHandler class="org.apache.solr.handler.component.SearchHandler" > name="/suggest"> > <lst name="defaults"> > <str name="spellcheck">true</str> > <str name="spellcheck.dictionary">suggest</str> > <str name="spellcheck.onlyMorePopular">true</str> > <str name="spellcheck.count">5</str> > <str name="spellcheck.collate">true</str> > </lst> > <arr name="components"> > <str>spellcheck</str> > </arr> > </requestHandler>