Currently, I am facing the following small problem while doing exact search (query enclosed within double quotes).
{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
"q": "\"sale\"",
"indent": "true",
"fl": "displayValue, categoryName, approved, averageRating, lastOneWeekCount, connectorName, score",
"wt": "json",
"_": "1579279511471"
}
},
"response": {
"numFound": 918,
"start": 0,
"maxScore": 11.044312,
"docs": [
{
"displayValue": "Net Sales Vs Contribution Margin",
"categoryName": "Sales Analytics (B07)",
"connectorName": "New BOBJ",
"lastOneWeekCount": 3,
"approved": "yes",
"averageRating": 4,
"score": 11.044312
},
The above "sale" query is matching against "Sales" term in the indexed data, which is not exact. Also this is happening because of the EdgeNgramFilterFactory that is in the defined text field (which uses whitespace tokenizer). I have managed to incrementally resolve different search issues with the current implementation of select request handler and now I need to solve the above problem of exact match. Following is my solrconfig details.
<lst name="defaults">
<str name="exact">false</str>
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="defType">edismax</str>
<str name="qf">
displayValue^20 description^5 connectorName_txt zenDescription_txt^5 zenBusinessOwner_txt^2
categoryName^8 reportOwner^2 reportDetailsNameColumn^5
</str>
<str name="pf2">
displayValue^20 description^5 connectorName_txt zenDescription_txt^5 zenBusinessOwner_txt^2
categoryName^8 reportOwner^2 reportDetailsNameColumn^5
</str>
<str name="pf3">
displayValue^20 description^5 connectorName_txt zenDescription_txt^5 zenBusinessOwner_txt^2
categoryName^8 reportOwner^2 reportDetailsNameColumn^5
</str>
<str name="tie">1</str>
<str name="mm">100%</str>
<int name="ps2">3</int>
<int name="ps3">9</int>
<int name="qs">0</int>
<str name="df">text</str>
<str name="q.alt">*:*</str>
<str name="sort">score desc, averageRating desc, lastOneWeekCount desc</str>
<str name="bq">
query({!boost b=20}approved:"yes")
</str>
</lst>
<lst name="appends">
<str name="fq">{!switch case.false='*:*' case.true='text_ex:$q' v=$exact}</str>
</lst>
</requestHandler>
In the above config details, I have attempted to solve the exact search problem by adding an extra switch case query parser in the config (after searching the net). Basically, I want to implement exact search if user input query has double quotes. I wanted to implement exact search when user specifies exact=true using the switch query parser. But I am kind of stuck as I am not getting any results. Can someone please help?
P.S Attaching the schema definition as well. Please check.
<fieldType name="text_ws" class="solr.TextField" omitNorms="false">
<analyzer type="index" omitTermFreqAndPositions="false">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
<fieldType name="text_exact" class="solr.TextField" omitNorms="false">
<analyzer type="index" omitTermFreqAndPositions="false">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0"
catenateWords="0" catenateNumbers="0" preserveOriginal="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0"
catenateWords="0" catenateNumbers="0" preserveOriginal="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>