I am trying to perform an exact match on the stored value (rather than the query value).
My indexed data is something like: "banana republic"
I need the following queries to match:
- shirts from banana republic
- banana republic items
- stuff banana republic and other stuff
These should not match:
- banana not republic
- banana is a good fruit
- Chile republic
My scenario is actually simple and easily doable with SQL using a query similar to: query_string LIKE '%stored_val%' but I couldn't configure the anlayzers to perform it. I am sure EdgeNGramFilter can achieve this, but it would be very expensive to create ngrams that are more than 30 characters long.
My current implementation is: In the index analyzer, use solr.KeywordTokenizerFactory. In the query analyzer, use solr.ShingleFilterFactory (2-4 tokens). Everything looks fine when using the analysis tool. But using the query API, the query gets translated to:
rawquerystring: "match_name:"banana republic"",
parsedquery_toString: "match_name:"(banana bananarepublic) republic""
which does not match my stored token "bananarepublic"
My analysis chain looks like:
<fieldType name="singletoken" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="../../common-config/mapping-ISOLatin1Accent.txt"/> <!-- map accented letters to their ascii equivilants -->
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory" pattern="[^A-Za-z0-9& ]" replacement=" "/>
<filter class="solr.PatternReplaceFilterFactory" pattern="(^\s+|\s+$)" replacement=""/> <!-- join everything in a single token with no spaces -->
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="../../common-config/mapping-ISOLatin1Accent.txt"/> <!-- map accented letters to their ascii equivilants -->
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory" /> <!-- using all default options from: https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory -->
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory" pattern="[^A-Za-z0-9& ]" replacement=" "/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4" outputUnigrams="true" tokenSeparator="" />
</analyzer>
</fieldType>