lucene-solr-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Paul <p...@nines.org>
Subject Re: autocomplete: case-insensitive and middle word
Date Wed, 18 Aug 2010 13:56:04 GMT
Here's my solution. I'm posting it in case it is radically wrong; I
hope someone can help straighten me out. It seems to work fine, and
seems fast enough.

In schema.xml:

<fieldType name="autocomplete" class="solr.TextField">
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.PatternReplaceFilterFactory"
pattern="([^a-z0-9])" replacement="" replace="all" />
            <filter class="solr.EdgeNGramFilterFactory"
maxGramSize="100" minGramSize="1" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.PatternReplaceFilterFactory"
pattern="([^a-z0-9])" replacement="" replace="all" />
            <filter class="solr.PatternReplaceFilterFactory"
pattern="^(.{20})(.*)?" replacement="$1" replace="all" />
        </analyzer>
</fieldType>

<field name="ac_name" type="autocomplete" indexed="true" stored="true"
multiValued="true"/>

Then I restarted solr to pick up the changes.

I then ran a script which reads each document out of the current
index, and adds the new field:

for each doc in my solr index:

doc['ac_name'] = doc['name'].split(' ')

and write the record back out.

Then, using rsolr, I make the following query:

response = @solr.select(:params => {
	:q=> "ac_name:#{prefix}",
	:start=> 0,
	:rows=> 500,
	:fl => "name"
})
matches = []
docs = response['response']['docs']
docs.each {|doc|
	matches.push(doc['name'])
}

"matches" is now an array of the values I want to display.

Mime
View raw message