<!DOCTYPE html>
<!-- 
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at
  
       http://www.apache.org/licenses/LICENSE-2.0
  
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<html>
  <head>
    <title>Data Model - Apache Blur (Incubator) Documentation</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="resources/css/bootstrap.min.css" rel="stylesheet" media="screen">
    <link href="resources/css/bs-docs.css" rel="stylesheet" media="screen">
  </head>
  <body>
    <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="http://incubator.apache.org/blur">Apache Blur (Incubator)</a>
        </div>
        <div class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
	        <li><a href="index.html">Main</a></li>
            <li><a href="getting-started.html">Getting Started</a></li>
            <li class="active"><a href="data-model.html">Data Model</a></li>
            <li><a href="cluster-setup.html">Cluster Setup</a></li>
            <li><a href="using-blur.html">Using Blur</a></li>
            <li><a href="Blur.html">Blur API</a></li>
            <li><a href="site/index.html" target="_blank">Maven Site</a></li>
            <li><a href="site/apidocs/index.html" target="_blank">Javadocs</a></li>
          </ul>
        </div>
      </div>
    </div>
    <div class="container bs-docs-container">
      <div class="row">
        <div class="col-md-3">
          <div class="bs-sidebar hidden-print affix" role="complementary">
            <ul class="nav bs-sidenav">
              <li>
                <a href="#structure">Structure</a>
                <ul class="nav">
                  <li><a href="#columns">Columns</a></li>
                  <li><a href="#records">Records</a></li>
                  <li><a href="#rows">Rows</a></li>
                </ul>
              </li>
              <li>
				<a href="#querying">Querying</a>
				<ul class="nav">
				  <li><a href="#row_query">Row Query</a></li>
				  <li><a href="#text_query">Text</a></li>
                  <li><a href="#string_query">String</a></li>
                  <li><a href="#numeric_query">Numeric</a></li>
                  <li><a href="#date_query">Date</a></li>
                  <li><a href="#spatial_query">Spatial</a></li>
                </ul>
			  </li>
              <li>
				<a href="#types">Types</a>
				<ul class="nav">
                  <li><a href="#text_type">Text</a></li>
                  <li><a href="#string_type">String</a></li>
                  <li><a href="#long_type">Long</a></li>
                  <li><a href="#int_type">Integer</a></li>
                  <li><a href="#float_type">Float</a></li>
                  <li><a href="#double_type">Double</a></li>
                  <li><a href="#date_type">Date</a></li>
                  <li><a href="#stored_type">Stored</a></li>
	  			  <li><a href="#spatial_type">Spatial</a>
				    <ul class="nav">
                      <li><a href="#spatial_pointvector">&nbsp;&nbsp;Point Vector</a></li>
                      <li><a href="#spatial_termprefix">&nbsp;&nbsp;Term Prefix</a></li>
                      <li><a href="#spatial_recursiveprefix">&nbsp;&nbsp;Recursive Prefix</a></li>
                    </ul>
                  </li>
                </ul>
			  </li>
			  <li>
				<a href="#custom_types">Custom Types</a>
				<ul class="nav">
                  <li><a href="#custom_types_creating">Creating</a></li>
                  <li><a href="#custom_types_distributing">Distributing</a></li>
                  <li><a href="#custom_types_using">Using</a>
				    <ul class="nav">
                      <li><a href="#custom_types_using_cluster">&nbsp;&nbsp;Cluster Wide</a></li>
                      <li><a href="#custom_types_using_table">&nbsp;&nbsp;Single Table</a></li>	
                    </ul>
                  </li>
                </ul>
              </li>
            </ul>
          </div>
        </div>
        <div class="col-md-9" role="main">
          <section>
            <div class="page-header">
              <h1 id="structure">Data Structure</h1>
            </div>
            <p class="lead">
              Blur is a table based query system. So within a single shard cluster there can be many different tables, each with a different schema, shard size, analyzers, etc. Each table contains Rows. A Row contains a row id (Lucene StringField internally) and many Records. A record has a record id (Lucene StringField internally), a family (Lucene StringField internally), and many Columns. A column contains a name and value, both are Strings in the API but the value can be interpreted as different types. All base Lucene Field types are supported, Text, String, Long, Int, Double, and Float.
            </p>
            <p>Starting with the most basic structure and building on it.</p>
            <h3 id="columns">Columns</h3>
            <p>
              Columns contain a name and value, both are strings in the API but can be interpreted as an Integer, Float, Long, Double, String, or Text. All Column types default to Text and will be analyzed during the indexing process.
            </p>
            <pre><code class="json">Column {"name" => "value"}</code></pre>
            <h3 id="records">Records</h3>
            <p>
              Record contains a Record Id, Family, and one or more Columns
            </p>
            <pre><code class="json">Record {
  "recordId" => "1234",
  "family" => "family1",
  "columns" => [
    Column {"column1" => "value1"},
    Column {"column2" => "value2"},
    Column {"column2" => "value3"},
    Column {"column3" => "value4"}
  ]
}</code></pre>
            <div class="bs-callout bs-callout-info"><h4>Quick Tip!</h4><p>The column names do not have to be unique within the Record. So you can treat multiple Columns with the same name as an array of values. Also the order of the values will be maintained.</p></div>
            <h3 id="rows">Rows</h3>
            <p>
              Rows contain a row id and a list of Records.
            </p>
            <pre><code class="json">Row {
  "id" => "r-5678",
  "records" => [
    Record {
      "recordId" => "1234",
      "family" => "family1",
      "columns" => [
        Column {"column1" => "value1"},
        Column {"column2" => "value2"},
        Column {"column2" => "value3"},
        Column {"column3" => "value4"}
      ]
    },
    Record {
      "recordId" => "9012",
      "family" => "family1",
      "columns" => [
        Column {"column1" => "value1"}
      ]
    },
    Record {
      "recordId" => "4321",
      "family" => "family2",
      "columns" => [
        Column {"column16" => "value1"}
      ]
    }
  ]
}</code></pre>
          </section>
          <section>
            <div class="page-header">
              <h1 id="querying">Querying</h1>
				<p>
				All queries follow the basic Lucene query syntax see (<a href="http://lucene.apache.org/core/4_4_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html">http://lucene.apache.org/core/4_4_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html</a>)
				for an extensive explanation on the syntax.
				</p>
				<p>
				All queries can have boolean logic like:
				<pre><code class="json">+docs.body:hadoop +docs.author:jon</code></pre>
                        </p><p>
				Which is the same as:
				<pre><code class="json">docs.body:hadoop AND docs.author:jon</code></pre>
				</p>
              <h3 id="row_query">Row Queries</h3>

<p>
Row queries allow you to execute queries across Records within the same Row.  Row queries are a similar idea to an inner join.
Let's say you want to find all the Rows that contain a Record with the family &quot;author&quot; and has a &quot;name&quot; Column that has that contains a term &quot;Jon&quot; and another Record with the family &quot;docs&quot; and has a &quot;body&quot; Column with a term of &quot;Hadoop&quot;.
<pre><code class="json">+&lt;author.name:Jon&gt; +&lt;docs.body:Hadoop&gt;</code></pre>
</p>

              <h3 id="text_query">Text</h3>
<p>Text fields are analyzed with Lucene's standard analyzers, which mean that the string is broken down into terms
and the terms capitalization is removed as well as any special punctuation.  See Lucene's documentation for further explanation.
</p>
<h4>Examples:</h4>
<p>
To run a query to find all the rows that contain a column with a term of &quot;hadoop&quot; where the family is &quot;docs&quot; and the column is  &quot;body&quot;.
<pre><code class="json">docs.body:hadoop</code></pre>
</p>
<p>
To run a query to find all the rows that contain a column with a term of &quot;hadoop&quot; and &quot;awesome&quot; where the family is &quot;docs&quot; and the column is &quot;body&quot;.
<pre><code class="json">docs.body:(+hadoop +awesome)</code></pre>
</p>
<p>
To run a query to find all the rows that contain a column with a phrase of &quot;hadoop is awesome&quot; where the family is &quot;docs&quot; and the column is &quot;body&quot;.
<pre><code class="json">docs.body:&quot;hadoop is awesome&quot;</code></pre>
</p>
<p>
To run a query to find all the rows that contain a column with a word of &quot;hadoop&quot; and we want to deal with misspellings (or a Fuzzy query) where the family is &quot;docs&quot; and the column is &quot;body&quot;.
<pre><code class="json">docs.body:hadoop~</code></pre>
</p>
<p>
To run a query to find all the rows that contain a column with a word that matches a wildcard pattern of &quot;h*d?op&quot; where the family is &quot;docs&quot; and the column is &quot;body&quot;.
<pre><code class="json">docs.body:h*d?op</code></pre>
</p>

              <h3 id="string_query">String</h3>
<p>String fields are indexed Columns that are not analyzed they are indexed as is.  Do not use String fields for 
large amount of text, this will increase the size of your index and probably not give you the desired behavior.  
So given the string "Hadoop" and "hadoop", these will be indexed as two different term because the String field 
is case sensitive.  Also if the string contains "The cow jumps over the moon." the single term that will be placed
into the index is "The cow jumps over the moon." as a single string.  This field type is normally used for id or
type lookups.
</p>
<h4>Examples:</h4>
<p>
To run a query to find all the rows that contain a column with a term of &quot;Hadoop&quot; where the family is &quot;docs&quot; and the column is  &quot;type&quot;.
<pre><code class="json">docs.type:Hadoop</code></pre>
</p>
              <h3 id="numeric_query">Numeric</h3>
<p>The numerics types are:
<ul>
<li>int</li>
<li>long</li>
<li>float</li>
<li>double</li>
</ul>
All numerics types can perform two types of queries:
<ul>
<li>Exact Match</li>
<li>Range</li>
</ul>
</p>

<h4>Examples:</h4>
<p>
To run a query to find all the rows that contain a column with a value of &quot;12345&quot; where the family is &quot;docs&quot; and the column is &quot;id&quot;.
<pre><code class="json">docs.id:12345</code></pre>
</p>
<p>
To run a query to find all the rows that contain a column with a starting value of &quot;12345&quot; and an ending values of &quot;54321&quot; where the family is &quot;docs&quot; and the column is &quot;id&quot;.
<pre><code class="json">docs.id:[12345 TO 54321]</code></pre>
</p>

<p>
To run a query to find all the rows that contain a column with a value less than &quot;12345&quot; where the family is &quot;docs&quot; and the column is &quot;id&quot;.
<pre><code class="json">docs.id:[MIN TO 12345}</code></pre>
</p>

<p>
To run a query to find all the rows that contain a column with a value less than or equal to &quot;12345&quot; where the family is &quot;docs&quot; and the column is &quot;id&quot;.
<pre><code class="json">docs.id:[MIN TO 12345]</code></pre>
</p>

<p>
To run a query to find all the rows that contain a column with a value great than to &quot;12345&quot; where the family is &quot;docs&quot; and the column is &quot;id&quot;.
<pre><code class="json">docs.id:{12345 TO MAX]</code></pre>
</p>

<p>
To run a query to find all the rows that contain a column with a value great than or equal to &quot;12345&quot; where the family is &quot;docs&quot; and the column is &quot;id&quot;.
<pre><code class="json">docs.id:[12345 TO MAX]</code></pre>
</p>

<h3 id="date_query">Date</h3>
<p>Date types are basically a long field type with a date parser built-in.

The date type can perform two types of queries:
<ul>
<li>Exact Match</li>
<li>Range</li>
</ul>
</p>

<h4>Examples:</h4>
<p>
To run a query to find all the rows that contain a column with a value of &quot;2012-09-11&quot; where the family is &quot;docs&quot; and the column is &quot;published_date&quot;.
<pre><code class="json">docs.published_date:2013-09-11</code></pre>
</p>
<p>
To run a query to find all the rows that contain a column with a starting value of &quot;2012-09-11&quot; and an ending values of &quot;2013-09-11&quot; where the family is &quot;docs&quot; and the column is &quot;published_date&quot;.
<pre><code class="json">docs.published_date:[2012-09-11 TO 2013-09-11]</code></pre>
</p>

              <h3 id="spatial_query">Spatial</h3>
<p>
Spatial queries are supported through the Lucene spatial module.  There are currently three 
different types of strategies:
<ul>
<li>Point Vector</li>
<li>Term Query Prefix Tree</li>
<li>Recursive Prefix Tree</li>
</ul>
Currently all of the built in spatial types are using a GEO spatial context, meaning the assumed
coordinates are on the planet Earth.  Each of these strategies support different indexing features
such as the shapes they can index, the shapes they can query with, and the operations they 
support during the query.  See the type section below to get a list of supported operations and
shapes per strategy. 
</p>
<h4>Examples:</h4>
<p>
To run a query to find all the rows that contain a location within 10 km (0.089932 10 km in degrees) of gis coordinate &quot;33.0, -88.0&quot; where the family is &quot;docs&quot; and the column is &quot;location&quot;.
<pre><code class="json">docs.location:"Intersects(Circle(33.0, -88.0 d=0.089932))"</code></pre>
</p>
<p>
To run a query to find all the rows that contain a location within 10 km of gis coordinate &quot;33.0, -88.0&quot; where the family is &quot;docs&quot; and the column is &quot;location&quot;.
<pre><code class="json">docs.location:"Intersects(Circle(33.0, -88.0 d=10.0km))"</code></pre>
</p>
<p>
To run a query to find all the rows that contain a location within 10 miles of gis coordinate &quot;33.0, -88.0&quot; where the family is &quot;docs&quot; and the column is &quot;location&quot;.
<pre><code class="json">docs.location:"Intersects(Circle(33.0, -88.0 d=10.0m))"</code></pre>
</p>
            </div>
          </section>
          <section>
            <div class="page-header">
              <h1 id="types">Types</h1>
              <h3 id="text_type">Text</h3>
              <p>
              The Text Type has the type name of:
<pre><code class="json">text</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>&quot;stopWordPath&quot; -Optional- default value is no stop words.  This should be a HDFS path.
	<br/>This will load stop words into the StandardAnalyzer for this field, one term per line.</li>
	
	          <li>&quot;analyzerClass&quot; -Optional- default value is a standard analyzer with no stop words.<br/>This could be any Analyzer class that has a default constructor or one that takes a Lucene Version enum.</li>
              </ul>
		  </p>
              <h3 id="string_type">String</h3>
              <p>
              The String Type has the type name of:
<pre><code class="json">string</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>None</li>
              </ul>
		  </p>
              <h3 id="long_type">Long</h3>
              <p>
              The Long Type has the type name of:
<pre><code class="json">long</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>&quot;numericPrecisionStep&quot; -Optional- default value is &quot;4&quot;</li>
              </ul>
		  </p>
              <h3 id="int_type">Integer</h3>
              <p>
              The Integer Type has the type name of:
<pre><code class="json">int</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>&quot;numericPrecisionStep&quot; -Optional- default value is &quot;4&quot;</li>
              </ul>
		  </p>
              <h3 id="float_type">Float</h3>
              <p>
              The Float Type has the type name of:
<pre><code class="json">float</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>&quot;numericPrecisionStep&quot; -Optional- default value is &quot;4&quot;</li>
              </ul>
		  </p>
              <h3 id="double_type">Double</h3>
              <p>
              The Double Type has the type name of:
<pre><code class="json">double</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>&quot;numericPrecisionStep&quot; -Optional- default value is &quot;4&quot;</li>
              </ul>
		  </p>
		              <h3 id="date_type">Date</h3>
		              <p>
		              The Date Type has the type name of:
		<pre><code class="json">date</code></pre>
		              <h5>Property Options:</h5>
		              <ul>
		              <li>&quot;dateFormat&quot; -Required- Examples: &quot;yyyy-MM-dd&quot;, &quot;MM/dd/yyyy&quot; or anything that SimpleDateFormat can parse.</li>
					  <li>&quot;timeUnit&quot; -Optional- Default is SECONDS.  Other options (DAYS, HOURS, MINUTES, SECONDS, MILLISECONDS)</li>
				      <li>&quot;numericPrecisionStep&quot; -Optional- default value is &quot;4&quot;</li>
		              </ul>
				  </p>
 
              <h3 id="stored_type">Stored</h3>
              <p>
              The Stored Type has the type name of:
<pre><code class="json">stored</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>None</li>
              </ul>
		  </p>
              <h3 id="spatial_type">Spatial</h3>
              <p></p>
              <h4 id="spatial_pointvector">Point Vector</h4>
              <p>
              The Point Vector Spatial Type has the type name of:
<pre><code class="json">geo-pointvector</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>None</li>
              </ul>
              <h5>Supported Indexing Shapes:</h5>
              <ul>
              <li>Point</li>
              </ul>
              <h5>Supported Querying Shapes:</h5>
              <ul>
              <li>Circle</li>
              <li>Rectangle</li>
              </ul>
              <h5>Supported Querying Operations:</h5>
              <ul>
              <li>Intersects</li>
              </ul>
              </p>
              <h4 id="spatial_termprefix">Term Prefix</h4>
              <p>
              The Term Prefix Spatial Type has the type name of:
<pre><code class="json">geo-termprefix</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>&quot;spatialPrefixTree&quot; can either equal to &quot;GeohashPrefixTree&quot; or &quot;QuadPrefixTree&quot;</li>
              <li>&quot;maxLevels&quot; -Optional- default value is &quot;11&quot;</li>
              </ul>
              <h5>Supported Indexing Shapes:</h5>
              <ul>
              <li>Point</li>
              </ul>
              <h5>Supported Querying Shapes:</h5>
              <ul>
              <li>Circle</li>
              <li>Rectangle</li>
              </ul>
              <h5>Supported Querying Operations:</h5>
              <ul>
              <li>Intersects</li>
              </ul>
              </p>
              <h4 id="spatial_recursiveprefix">Recursive Prefix</h4>
              <p>
              The Term Prefix Spatial Type has the type name of:
<pre><code class="json">geo-recursiveprefix</code></pre>
              <h5>Property Options:</h5>
              <ul>
              <li>&quot;spatialPrefixTree&quot; can either equal to &quot;GeohashPrefixTree&quot; or &quot;QuadPrefixTree&quot;</li>
              <li>&quot;maxLevels&quot; -Optional- default value is &quot;11&quot;</li>
              </ul>
              <h5>Supported Indexing Shapes:</h5>
              <ul>
              <li>Point</li>
              <li>Circle</li>
              <li>Rectangle</li>
              </ul>
              <h5>Supported Querying Shapes:</h5>
              <ul>
              <li>Circle</li>
              <li>Rectangle</li>
              </ul>
              <h5>Supported Querying Operations:</h5>
              <ul>
              <li>IsDisjointTo</li>
              <li>Intersects</li>
              <li>IsWithin</li>
              <li>Contains</li>
              </ul>
              </p>
            </div>
          </section>
          <section>
	         <div class="page-header">
                <h1 id="custom_types">Custom Types</h1>
	         </div>
	         <p class="lead">Custom types in Blur allow you to create your own types in Lucene
		     as well as plugging into the query parser so that you can use your custom type.</p>
	         <h3 id="custom_types_creating">Creating</h3>
	         <p>		
You will need to extend the "org.apache.blur.analysis.FieldTypeDefinition" class found in the blur-query module.  If you need to use a different Analyzer than the StandardAnalyzer used in the "text" type just extend the "org.apache.blur.analysis.type.TextFieldTypeDefinition" and make the appropriate changes.
		     </p>
<p>
For types that require custom query parsing	or custom "org.apache.lucene.index.IndexableField" manipulation without the use of an Analyzer.  Please extend "org.apache.blur.analysis.type.CustomFieldTypeDefinition".
</p>
<p>
<h4>Example</h4>
Below is a simple type that is basically the same as a "string" type, however it's implemented by extending "org.apache.blur.analysis.type.CustomFieldTypeDefinition".<br/><br/>
<pre><code class="java">public class ExampleType extends CustomFieldTypeDefinition {

  private String _fieldNameForThisInstance;

  /**
   * Get the name of the type.
   * 
   * @return the name.
   */
  @Override
  public String getName() {
    return "example";
  }

  /**
   * Configures this instance for the type.
   * 
   * @param fieldNameForThisInstance
   *          the field name for this instance.
   * @param properties
   *          the properties passed into this type definition from the
   *          {@link Blur.Iface#addColumnDefinition(String, ColumnDefinition)}
   *          method.
   */
  @Override
  public void configure(String fieldNameForThisInstance, Map<String, String> properties, 
                        Configuration configuration) {
    _fieldNameForThisInstance = fieldNameForThisInstance;
  }

  /**
   * Create {@link Field}s for the index as well as for storing the original
   * data for retrieval.
   * 
   * @param family
   *          the family name.
   * @param column
   *          the column that holds the name and value.
   * 
   * @return the {@link Iterable} of {@link Field}s.
   */
  @Override
  public Iterable&lt;? extends Field&gt; getFieldsForColumn(String family, Column column) {
    String name = family + "." + column.getName();
    String value = column.getValue();
    return makeIterable(new StringField(name, value, Store.YES));
  }

  /**
   * Create {@link Field}s for the index do NOT store the data because the is a
   * sub column.
   * 
   * @param family
   *          the family name.
   * @param column
   *          the column that holds the name and value.
   * @param subName
   *          the sub column name.
   * 
   * @return the {@link Iterable} of {@link Field}s.
   */
  @Override
  public Iterable&lt;? extends Field&gt; getFieldsForSubColumn(String family, Column column, 
       String subName) {
    String name = family + "." + column.getName() + "." + subName;
    String value = column.getValue();
    return makeIterable(new StringField(name, value, Store.NO));
  }

  /**
   * Gets the query from the text provided by the query parser.
   * 
   * @param text
   *          the text provided by the query parser.
   * @return the {@link Query}.
   */
  @Override
  public Query getCustomQuery(String text) {
    return new TermQuery(new Term(_fieldNameForThisInstance, text));
  }

}
</code></pre>
	
</p>

	         <h3 id="custom_types_distributing">Distributing</h3>
	         <p>Once you have created and tested your custom type you will need to copy the jar file containing your custom type to all the servers in the cluster.  The jar file will need to be located within the $BLUR_HOME/lib directory.  Once there all the servers will need to be restarted to have the jar file be picked up in the classpath.<br/><br/>In a later version of Blur we hope to have this be a dynamic operation that can be performed without restarting the cluster.</p>
	         <h3 id="custom_types_using">Using</h3>
			 <p>You can either add your custom type to the entire cluster or per table.</p>
	         <h4 id="custom_types_using_cluster">Cluster Wide</h4>
	         <p>For cluster wide configuration you will need to add the new field types into the blur-site.properties file on each server.
<pre><code class="bash">blur.fieldtype.customtype1=org.apache.blur.analysis.type.ExampleType1
blur.fieldtype.customtype2=org.apache.blur.analysis.type.ExampleType2
...</code></pre>

Please note that the prefix of "blur.fieldtype." is all that is used from the property name because the type gets it's name from the internal method of "getName".  However the property names will need to be unique within the file.
</p>
	         <h4 id="custom_types_using_table">Single Table</h4>
	         <p>For a single table configuration you will need to add the new field types into the tableProperties map in the TableDescriptor as you define the table.
<pre><code class="java">tableDescriptor.putToTableProperties("blur.fieldtype.customtype1", 
	"org.apache.blur.analysis.type.ExampleType1");
tableDescriptor.putToTableProperties("blur.fieldtype.customtype2", 
	"org.apache.blur.analysis.type.ExampleType2");
...</code></pre>

Please note that the prefix of "blur.fieldtype." is all that is used from the property name because the type gets it's name from the internal method of "getName".  However the property names will need to be unique within the map.</p>
	      </section>
        </div>
      </div>
    </div>

<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
    
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="resources/js/jquery-2.0.3.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="resources/js/bootstrap.min.js"></script>
    <!-- Enable responsive features in IE8 with Respond.js (https://github.com/scottjehl/Respond) -->
    <script src="resources/js/respond.min.js"></script>
    <script src="resources/js/docs.js"></script>
  </body>
</html>
