原文出处:http://www.quarkruby.com/2007/9/14/advanced-acts_as_solr
This article extends our acts_as_solr : search and faceting tutorial and talks about how to manage rails associations, solr indexes and more with acts_as_solr.
rebuild_solr_index
is a class method to re-build your model indexes on import of external data.
For large tables rebuilding Solr index is a time consuming process. See the fifth line in the pseudo code below (index optimization call), it makes rebuild_solr_index a slow process. For large tables, you do not want optimization to take place for each object added to the table. Whereas, removing optimization calls slows down the process of updating solr index.
1 2 3 4 5 6 7 |
## pseudo code def rebuild_solr_index for_each_row_in_table do |doc| doc.save_to_solr_index index.optimize end end |
The solution to the problem is to use batch_size
in #rebuild_solr_index
. With batch size, say for example 100, the index optimization call is executed after indexing 100 rows.
If you do not want to index the complete data but only few rows based on conditions, use optional arguments batch_size
and finder
in rebuild_solr_index.
1 2 3 |
def finder(ar, options) ar.find (:all, options.merge({:order => self.primary_key})) end |
Assumption: Column names in table definition are same as the names of the fields using which index has been/will be created.
vendor/plugins/acts_as_solr/solr/solr/conf/schema.xml
(continuing with example of our previous tutorial, we add name1, brand, resolution to schema.xml). 1 2 3 4 5 6 7 8 |
<field name="text" type="text" indexed="true" stored="true" multiValued="true"/> <field name="name1" type="text" indexed="true" stored="false" /> <field name="brand" type="string" indexed="true" stored="false" /> <field name="resolution" type="sfloat" indexed="true" stored="false" /> <copyField source="*_facet" dest="text"/> <copyField source="brand" dest="text"/> <copyField source="name1" dest="text"/> |
1 2 |
cd /path/to/rails/dir
patch -p0 custom-schema.patch |
1 2 3 |
class Camera acts_as_solr :custom_schema=>true, :fields=>[:name,:brand,:resolution] end |
Goal is to highlight search term(s) in search results. Follow the steps below :
1 2 |
cd /path/to/rails/dir
patch -p0 highlight-solrconfig.patch |
vendor/plugins/acts_as_solr/solr/solr/conf/schema.xml
to enable storage of data, which is required to return the highlighted text data. For example, we modify configuration file to store the fields having text dataType to get highlighted matching terms for name1 field.
1 2 3 4 |
<!-- Original config --> <dynamicField name="*_t" type="text" indexed="true" stored="false"/> <!-- New config --> <dynamicField name="*_t" type="text" indexed="true" stored="true"/> |
Apply one more patch in the same way as the previous one. This patch enables acts_as_solr to handle the option of highlighting in find_by_solr queries and parses the results returned by solr. And now we are ready to roar...
1 2 3 4 5 6 7 8 9 |
@results = Camera.find_by_solr("canon powershot", :highlight=>{:fields=>"name1"}) @results.highlights ## returns hash of objects id and hash of the columns with matched text data {1=>{:name1=>"<em>Canon</em> <em>Powershot</em> sd1000"} ... } #You want to display names with highlighted terms: @results.docs.each do |doc| <%= @results.highlights[doc.id][:name1] -%><br/> end |
fields
: columns to highlight terms for (default is none, and no highlighted text) prefix
: You do not want to have "<em>" tag around matched search term(s), tell your tag here. (eg. "<span class='highlight'>") suffix
: Ending tag for matched term(s) max_snippets
: stop searching the column after max_snippets matched terms found
Note: If you want both the functionalities Custom schema and Highlighting together, use these two patches. Patch 1 and Patch 2.
Lets say I have two models, User (columns: username, password) and UserProfile (columns: full name, location, favorite food .... and many more). These two models have one-to-one association (:has_one, :belongs_to) between them and I have two problems :
Fabio Confalonieri has written a small hack for the solution to both the problems along with good explanation.
Wanna see the statistics for created index?
Download
If your search results are not good enough because the text is not indexed properly, it might be due to presence of acronyms or words having apostrophes or html content in your data. Solr provides you with many options for analyzing and modifying text before it is indexed and searched. Read these options at Solr's Wiki page. Remember, you need to make these modifications in schema.xml file.
Note : The default behaviour of acts_as_solr is to index model objects automatically upon save or update of a record.
<!---->
this xsl file as luke.xsl tovendor/plugins/acts_as_solr/solr/solr/conf/xslt/
and then open url:
http://localhost:8982/solr/admin/luke?wt=xslt&tr=luke.xsl