I'm toying around with the suggester component, like described here:
http://www.andornot.com/blog/post/Advanced-autocomplete-with-Solr-Ngrams-and-Twitters-typeaheadjs.aspx
So I made 4 fields:
<field name="text_suggest" type="text_suggest" indexed="true"
stored="true" multiValued="true" />
<copyField source="name" dest="text_suggest" />
<field name="text_suggest_edge" type="text_suggest_edge" indexed="true"
stored="true" multiValued="true" />
<copyField source="name" dest="text_suggest_edge" />
<field name="text_suggest_ngram" type="text_suggest_ngram"
indexed="true" stored="true" multiValued="true" />
<copyField source="name" dest="text_suggest_ngram" />
<field name="text_suggest_dictionary_ngram"
type="text_suggest_dictionary_ngram" indexed="true" stored="true"
multiValued="true" />
<copyField source="name" dest="text_suggest_dictionary_ngram" />
with the corresponding definitions:
<fieldType name="text_suggest" class="solr.TextField">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
<fieldType name="text_suggest_edge" class="solr.TextField">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1"
maxGramSize="50" side="front" />
</analyzer>
</fieldType>
<fieldType name="text_suggest_ngram" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1"
maxGramSize="50" side="front" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_suggest_dictionary_ngram" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.DictionaryCompoundWordTokenFilterFactory"
dictionary="dictionary.txt" minWordSize="5" minSubwordSize="3"
maxSubwordSize="30" onlyLongestMatch="false"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1"
maxGramSize="50" side="front" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
I'm calling the suggester component this way:
http://<address>:8983/solr/<core>/suggest?qf="text_suggest^6.0%20test_suggest_edge^3.0%20text_suggest_ngram^1.0%20text_suggest_dictionary_ngram^0.2"&q=wa
This seems to work fine:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
</lst>
<lst name="spellcheck">
<lst name="suggestions">
<lst name="wa">
<int name="numFound">5</int>
<int name="startOffset">0</int>
<int name="endOffset">2</int>
<arr name="suggestion">
<str>wandelement aus gitter</str>
<str>wandelement aus stahlblech</str>
<str>wandelement</str>
<str>wandhalter für prospekte</str>
<str>wandascher, h 300 × b 230 × t 60 mm</str>
</arr>
</lst>
<str name="collation">(wandelement aus gitter)</str>
</lst>
</lst>
</response>
However, I added the fourth field so I could get low-boosted suggestions
using the afformentioned DictionaryCompoundWordTokenFilterFactory. A
sample analysis for the field(type) text_suggest_dictionary_ngram for
the word "Geländewagen":
g
ge
gel
gelä
gelän
geländ
gelände
geländew
geländewa
geländewag
geländewage
geländewagen
g
ge
gel
gelä
gelän
geländ
gelände
w
wa
wag
wage
wagen
As we can see, the DictionaryCompoundWordTokenFilterFactory extracts the
word "wagen" and EdgeNGrams it. However, I cannot get results from these
NGrams. Trying "wag" as the search term for the suggester, there are no
results.
However, doing an analysis of "Geländewagen" (as field value index) and
"wag" (as field value query), analysis shows a match.
I had the thought that it might be because the underlying component of
the suggester is a spellchecker, and a spellchecker wouldn't "correct"
"wag" to "wagen" because there was an NGram that spelled "wag", and so
the word was spelled correctly already. So I tried without the
EdgeNGrams, but the result stays the same.