Yes, approach #2 will certainly be useful. I'll open an issue. On Wed, Mar 18, 2009 at 6:20 PM, Grant Ingersoll <gsing...@apache.org>wrote:
> Hmm, I don't think there is currently a solution for this. #1 is not > viable for the reasons you mentioned and #2 is not supported by the current > code. That being said, I think it wouldn't be too hard to for someone to > work up a patch for this. Essentially, we need the ability to add in per > dictionary queries and then be able to route them to each dictionary. If > you feel up to this, I can take a look at your patch, if not at least open a > JIRA issue for it so someone else might take it up. Unfortunately, I don't > have the time right at the moment, but maybe in a few weeks. > > -Grant > > > On Mar 17, 2009, at 3:40 PM, Shyamsunder Reddy wrote: > > My advanced search option allows users to search for three different >> fields same time. >> The fields are - first name, last name and org name. Now I have to add >> spell checking feature for the fields. >> >> When wrong spelling is entered for each of these words like first name: >> jahn, last name: smath, org and org name: bpple >> >> the search result should return a suggestion like (collation) >> firstname:john AND lastname:smith AND orgname: apple >> >> >> What is the best approach to implement spell checking for these three >> different fields: >> >> 1. Build a single directory for all fields by copying them into a 'spell' >> field as: >> schema.xml configuration >> <!--Setup simple analysis for spell checking--> >> <fieldType name="textSpell" class="solr.TextField" >> positionIncrementGap="100" > >> <analyzer> >> <tokenizer class="solr.StandardTokenizerFactory"/> >> <filter class="solr.LowerCaseFilterFactory"/> >> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> >> </analyzer> >> </fieldType> >> <field name="FIRST_NAME" type="text" indexed="true" stored="true"/> >> <field name="LAST_NAME" type="text" indexed="true" stored="true"/> >> <field name="ORG_NAME" type="text" indexed="true" stored="true" >> required="true"/> >> <field name="spell" type="textSpell" indexed="true" stored="true" >> multiValued="true"/> >> >> <copyField source="FIRST_NAME" dest="spell"/> >> <copyField source="LAST_NAME" dest="spell"/> >> <copyField source="ORG_NAME" dest="spell"/> >> >> solrconfig.xml configuration >> <searchComponent name="spellcheck" class="solr.SpellCheckComponent"> >> <str name="queryAnalyzerFieldType">textSpell</str> >> <lst name="spellchecker"> >> <str name="name">default</str> >> <str name="field">spell</str> >> <str name="spellcheckIndexDir">./spellchecker</str> >> </lst> >> </searchComponent> >> >> Now the queries: >> 1a. >> <URL>/select?q=FIRST_NAME:jahn&LAST_NAME:smath&ORG_NAME:bpple&spellcheck=true >> >> The spell check searches against the dictionary './spllechecker' returns >> the suggestions as >> FIRST_NAME:john, LAST_NAME:smath and ORG_NAME:apple. Works as expected. >> >> 1b. <URL>/select?q=LAST_NAME:jahn&spellcheck=true >> The spell check searches against the dictionary './spllechecker' returns >> the suggestions for LAST_NAME as 'john' >> But there is no last name 'john' for the field LAST_NAME. So the sub >> sequent search returns NO results, which is not accepted. >> >> So, this approach seems to be wrong for me...... >> >> 2. Build a separate directory for each field. >> schema.xml configuration >> <!--Setup simple analysis for spell checking--> >> <fieldType name="textSpell" class="solr.TextField" >> positionIncrementGap="100" > >> <analyzer> >> <tokenizer class="solr.StandardTokenizerFactory"/> >> <filter class="solr.LowerCaseFilterFactory"/> >> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> >> </analyzer> >> </fieldType> >> <field name="FIRST_NAME" type="text" indexed="true" stored="true"/> >> <field name="LAST_NAME" type="text" indexed="true" stored="true"/> >> <field name="ORG_NAME" type="text" indexed="true" stored="true" >> required="true"/> >> <field name="spell_fname" type="textSpell" indexed="true" stored="true" >> multiValued="true"/> >> <field name="spell_lname" type="textSpell" indexed="true" stored="true" >> multiValued="true"/> >> <field name="spell_org_name" type="textSpell" indexed="true" >> stored="true" multiValued="true"/> >> >> <copyField source="FIRST_NAME" dest="spell_fname"/> >> <copyField source="LAST_NAME" dest="spell_lname"/> >> <copyField source="ORG_NAME" dest="spell_org_name"/> >> >> solrconfig.xml configuration >> <searchComponent name="spellcheck" class="solr.SpellCheckComponent"> >> <str name="queryAnalyzerFieldType">textSpell</str> >> <lst name="spellchecker"> >> <str name="name">firstname</str> >> <str name="field">spell_fname</str> >> <str name="spellcheckIndexDir">./fname_spellchecker</str> >> </lst> >> <lst name="spellchecker"> >> <str name="name">lastname</str> >> <str name="field">spell_lname</str> >> <str name="spellcheckIndexDir">./lname_spellchecker</str> >> </lst> >> <lst name="spellchecker"> >> <str name="name">oname</str> >> <str name="field">spell_org_name</str> >> <str name="spellcheckIndexDir">./orgname_spellchecker</str> >> </lst> >> </searchComponent> >> >> Now the queries: >> 1a. >> <URL>/select?q=FIRST_NAME:jahn&LAST_NAME:smath&ORG_NAME:bpple&spellcheck=true >> >> How can I mention in the query to search against different dictionaries >> for different fields like >> FIRST_NAME in fname_spellchecker, LAST_NAME in lname_spellchecker and >> ORG_NAME in orgname_spellchecker? >> >> Or can I make the spell checker to store the field names and its values. >> >> Please discuss my approaches and suggest a solution? >> >> >> >> > -- Regards, Shalin Shekhar Mangar.