24

I want to configure my Solr search engine so I get an exact match for the search term I enter.

eg. 'taxes' should return documents with 'taxes' and not 'tax', 'taxation' etc.

Any help or tips would be appreciated.

6 Answers 6

26

I presume your field is a TextField, by default solr does a fuzzy search on this field. What you want is to set up your field as a string field and add no tokenizer then you'll get an exact match.

You can even combine the exact search with a fuzzy search and use DisMax to boost the relative weights.

Example (schema.xml) :

<field name="name" type="string" indexed="true" stored="false" required="true" /> <field name="nameString" type="string" indexed="true" stored="false" required="true" /> <copyField source="name" dest="nameString"/> 

Example (solrconfig.xml) :

<requestHandler name="accounts" class="solr.SearchHandler"> <lst name="defaults"> <str name="defType">dismax</str> <str name="qf"> nameString^10.0 name^5.0 description^1.0 </str> <str name="tie">0.1</str> </lst> </requestHandler> 
Sign up to request clarification or add additional context in comments.

4 Comments

Is this possible at query time, with a special operator? Like =taxes
@mlissner, The above XML is simply default parameters which are added to the query. U could have done so by adding to your query defType=dismax&qa=nameString^10.0 name^5.0 description^1.0 etc etc
@ItayMoav, the goal is to have the users be able to place the exact match query.
Yes, I understood you. If u know u can add those params to query, you can put a UI on top that will generate the query...
7

To turn off stemming in your schema.xml, you can define text field like this:

<types> <!-- other fields definition --> <fieldType name="text_no_stem" class="solr.TextField" omitNorms="false"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> <!-- other fields definition --> </types> <fields> <!-- other fields definition --> <dynamicField name="*_nostem" type="text_no_stem" indexed="true" stored="true"/> <!-- other fields definition --> </fields> 

I'm using sunspot to integrate solr with Ruby on Rails. With this in the schema.xml I define my searchable block like this:

searchable do text(:wants, as: :wants_nostem) end 

Comments

4

Turn off stemming.

3 Comments

Thanks Hank, maybe I should have phrased my question more appropriately, How do I disable stemming? :)
sometimes re-index could be painful, especially if it took a long time on big data. Is there another way around instead of turning off stemming?
4

Use the quotes for exact match result :

Example :

core Name : core1 Key : namestring

http://localhost:8983/solr/core1/select?q=namestring:"taxes"&wt=json&indent=true

Comments

2

Use solr string field whcih will do an exact value search e.g

<fieldType class="solr.StrField" name="string" omitNorms="true" sortMissingLast="true" /> 

Comments

0

For using double quotes (") like Priya suggested, you also need to escape every single backslash with another backslash.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.