add PerFieldAnalyzerWrapper support @ index time

    The Mapper creates PerFieldAnalyzerWrapper and uses that for
    indexing.

    At the moment this is pretty incomplete, you can add
    "EdgeNgram"/"Whitespace"/anything that accepts only
    "Version.class,Reader.class" arguments, plus all TokenFilters that
    accept "Version.class,TokenStream.class" as arguments. You must use
full
    class paths everywhere. LowerCaseFilter is called as

    filters => ["org.apache.lucene.analysis.core.LowerCaseFilter"]

    example:

        analyzers => {
            "author.gram" => {
                tokenizer =>
"org.apache.lucene.analysis.ngram.EdgeNGramTokenizer",
                min_gram => 1,
                max_gram => 7,
                filters =>
["org.apache.lucene.analysis.core.LowerCaseFilter"]
            }
        },

    so if you index a field named author.gram it will use the
    edgeNgramTokenizer with min_gram 1, and max_gram 7, and output the
    following analyzer(this is the log message when you create any kind of
    analyzer at index time):

     1392580670_grep_@[bz.brick.RAMBrick.Mapping.parseAnalyzer(Mapping.java:349)]
org.apache.lucene.analysis.ngram.EdgeNGramTokenizer({max_gram=7,
min_gram=1}) filters:
<["org.apache.lucene.analysis.core.LowerCaseFilter"]> TOKENIZING:
<Testing 1,2,3 1_underscore 2@at 3#hash> AS:
<[t][te][tes][test][testi][testin][testing]>

    it just outputs the tokens from "Testing 1,2,3 1_underscore 2@at
    3#hash".
add analyzer based "match" query

match => {
    "category.keyword" => {
        query => "green yellow",
        type  => "bool",  # default
        bool_clause          => "SHOULD",  # or MUST
        minimum_should_match => 1, # default is 0
        analyzer             => "category.keyword"
    }
}

match => {
    "category.keyword" => {
        query => "green yellow",
        type => "dis_max",
        tie_breaker => 1,
        analyzer => "category.keyword"
    }
}

it uses the "analyzer" to spawn a bunch of tokens, and it creates
"TermQuery" for all of them, after that it puts the term-queries
into "boolean" or "dis_max" query. If you dont specify analyzer it will
try to use the field's name and look it up in the analyzers map of the index.
If there is no specific analyzer for this field it will use the default
analyzer which is "WhitespaceAnalyzer".