Anirudh Jadhav
Anirudh Jadhav

Reputation: 1007

Search a middle or suffix string using solr suggestor?

I am using solr 5.3
My String are :- Anirudh, Ani, Aniket
When I type "Ani" it does give me all the above string.
But when I type "ket" it does not give any result.
Expected :- "Aniket".


SolrConfig.xml

<searchComponent name="suggest" class="solr.SuggestComponent">
        <lst name="suggester">
            <str name="name">mySuggester</str>
            <str name="lookupImpl">FreeTextLookupFactory</str>
            <str name="dictionaryImpl">DocumentDictionaryFactory</str>
            <str name="field">name</str>
            <!-- <str name="weightField">price</str> -->
            <str name="suggestAnalyzerFieldType">key_lower_case</str>
            <str name="buildOnStartup">false</str>
        </lst>
    </searchComponent>

    <requestHandler name="/suggest" class="solr.SearchHandler"
        startup="lazy">
        <lst name="defaults">
            <str name="suggest">true</str>
            <str name="suggest.count">10</str>
        </lst>
        <arr name="components">
            <str>suggest</str>
        </arr>
    </requestHandler>


Schema.xml:-

<schema name='history' version='1.1'>
        <types>
                <fieldtype name='string' class='solr.StrField' />
                <fieldtype name='long' class='solr.TrieLongField' />

                <fieldType name="key_lower_case" class="solr.TextField"
                        sortMissingLast="true" omitNorms="true">
                         <analyzer>
                                <tokenizer class="solr.KeywordTokenizerFactory"/>
                                <filter class="solr.LowerCaseFilterFactory" />
                         </analyzer>
                 </fieldType>
        </types>

        <fields>
                <field name='id' type='long' required='true' />
                <field name="_version_" type="long" indexed="true" stored="true"/>
                <field name='user_id' type='string'/>
                <field name='jsons' type='string' multiValued='true' />
                <field name="row_type" type='string'/>
                <field name='name' type='key_lower_case' indexed="true" stored="true" required='true'/>
                <field name='composite_row-type_name' type='string'/>
                <dynamicField name='*_string' type='string' multiValued='true' indexed='true' stored='true'/>
        </fields>
        <uniqueKey>composite_row-type_name</uniqueKey>
        <solrQueryParser defaultOperator='OR' />
</schema>


Your suggestion and comments are welcome. Thanks in Advance.

Upvotes: 0

Views: 339

Answers (1)

Abhijit Bashetti
Abhijit Bashetti

Reputation: 8658

You can modify your field type in your schema.xml. Use the below "key_lower_case" fieldType for your field(s) where you want to perform the search what is expected to you.

Once you are done with schema.xml changes, you need to do the restart the server ans re-index the data.

<fieldType name="key_lower_case" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="10"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
    </analyzer>
</fieldType>

You have already added your field.

<field name='name' type='key_lower_case' indexed="true" stored="true" required='true'/>

with the help of NGramTokenizerFactory you can achieve below token

For the input text : "abhijit"

Tokens genereted as :

ab, abh, abhi, abhiji, abhijit, bh, bhi, bhij... etc

Upvotes: 2

Related Questions