Part 1: Apache Solr - Creating Custom Fields
This is the first of two blog posts. In this one I will show you how to create a custom search index in Apache Solr. Part 2 will go into how you can then manually set the field bias of your custom field so that you can control it through the settings with the Apache Solr module.
Creating a custom field
Adding custom fields to Apache Solr is often something that you can end up needing to do for a project. The Apache solr module makes this easy to do with: hook_apachesolr_index_document_build().
<span style="color: #009933; font-style: italic;">/** * Implements hook_apachesolr_index_document_build(). */</span> <span style="color: #000000; font-weight: bold;">function</span> MY_MODULE_apachesolr_index_document_build<span style="color: #009900;">(</span>ApacheSolrDocument <span style="color: #000088;">$document</span><span style="color: #339933;">,</span> <span style="color: #000088;">$entity</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000088;">$document</span><span style="color: #339933;">-&</span>gt<span style="color: #339933;">;</span>addField<span style="color: #009900;">(</span><span style="color: #339933;">&</span><span style="color: #666666; font-style: italic;">#39;ss_my_field&#39;, &#39;&#39;); } </span>
When defining the field you will notice that this is prefixed with 'ss_' which is very important as it tells Apache Solr what type of field it is.
This prefix can be two or three characters long, with the first character defining the data type of field (e.g. string (s), boolean (b), date (d) etc.) and the last character defines if it is a single (s) or multi-valued (m) field.
If you have a look at the schema.xml file that comes with the ApacheSolr module you will see a section that details the standard prefixes for field indexes. Here is a snippet from the file:
<span style="color: #339933;"><!--</span> We <span style="color: #000000; font-weight: bold;">use</span> long <span style="color: #b1b100;">for</span> integer since <span style="color: #cc66cc;">64</span> bit ints are now common in PHP<span style="color: #339933;">.</span> <span style="color: #339933;">--><</span>dynamicfield indexed<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> multivalued<span style="color: #339933;">=</span><span style="color: #0000ff;">"false"</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">"is_*"</span> stored<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> type<span style="color: #339933;">=</span><span style="color: #0000ff;">"long"</span><span style="color: #339933;">></span> <span style="color: #339933;"><</span>dynamicfield indexed<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> multivalued<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">"im_*"</span> stored<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> type<span style="color: #339933;">=</span><span style="color: #0000ff;">"long"</span><span style="color: #339933;">></span> <span style="color: #339933;"><!--</span> <a href="http://www.php.net/list"><span style="color: #990000;">List</span></a> of floats can be saved in a regular float field <span style="color: #339933;">--><</span>dynamicfield indexed<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> multivalued<span style="color: #339933;">=</span><span style="color: #0000ff;">"false"</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">"fs_*"</span> stored<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> type<span style="color: #339933;">=</span><span style="color: #0000ff;">"float"</span><span style="color: #339933;">></span> <span style="color: #339933;"><</span>dynamicfield indexed<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> multivalued<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">"fm_*"</span> stored<span style="color: #339933;">=</span><span style="color: #0000ff;">"true"</span> type<span style="color: #339933;">=</span><span style="color: #0000ff;">"float"</span><span style="color: #339933;">></span> <span style="color: #339933;"></</span>dynamicfield<span style="color: #339933;">></</span>dynamicfield<span style="color: #339933;">></</span>dynamicfield<span style="color: #339933;">></</span>dynamicfield<span style="color: #339933;">></span>
Having defined your new index you will need to tell Apache Solr about it. To do this all you have to do is do a full re-index of your content which will register your custom field with Solr. You can check that your field has been index correctly by checking the Solrs search index report - /admin/reports/apachesolr.
Having now indexed your new field you can now alter the query to make sure of this new field using hook_apachesolr_query_alter().
<span style="color: #009933; font-style: italic;">/** * Implements hook_apachesolr_query_alter(). */</span> <span style="color: #000000; font-weight: bold;">function</span> MY_MODULE_apachesolr_query_alter<span style="color: #009900;">(</span>DrupalSolrQueryInterface <span style="color: #000088;">$query</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&</span>gt<span style="color: #339933;">;</span>addParam<span style="color: #009900;">(</span><span style="color: #339933;">&</span><span style="color: #666666; font-style: italic;">#39;sort&#39;, &#39;ss_my_field asc&#39;); } </span>
You will now see that this is changing the results of your search based upon you new field.
Now you've created your customer field, my next post will show you how you can define it so that you can manually set the field bias within the Apache Solr admin section when a search is performed.
Interested to get feedback on part one though - so share your comments below!
Read morePart 1: Apache Solr - Creating Custom FieldsBy Mike Davis | 29th August 2014