I have an index that is set as follows:
settings: {
index.analysis.analyzer.eng_search_analyzer.filter.0: lowercase
index.analysis.analyzer.eng_search_analyzer.filter.1: icu_folding
index.analysis.analyzer.eng_search_analyzer.char_filter.0: html_strip
index.analysis.filter.eng_ngram_filter.type: nGram
index.analysis.filter.eng_ngram_filter.min_gram: 1
index.analysis.analyzer.eng_search_analyzer.tokenizer: whitespace
index.analysis.analyzer.eng_search_analyzer.filter.2: icu_normalizer
index.analysis.analyzer.eng_index_analyzer.filter.1: eng_ngram_filter
index.analysis.analyzer.eng_index_analyzer.filter.0: lowercase
index.number_of_shards: 2
index.analysis.filter.eng_ngram_filter.token_chars.1: digit
index.analysis.filter.eng_ngram_filter.token_chars.0: letter
index.analysis.filter.eng_ngram_filter.token_chars.3: symbol
index.analysis.filter.eng_ngram_filter.token_chars.2: punctuation
index.analysis.analyzer.eng_index_analyzer.type: custom
index.analysis.analyzer.eng_index_analyzer.char_filter.0: html_strip
index.analysis.analyzer.eng_index_analyzer.filter.3: icu_normalizer
index.analysis.filter.eng_ngram_filter.max_gram: 20
index.analysis.analyzer.eng_index_analyzer.filter.2: icu_folding
index.number_of_replicas: 1
index.analysis.analyzer.eng_index_analyzer.tokenizer: whitespace
index.analysis.analyzer.eng_search_analyzer.type: custom
index.version.created: 900799
index.uuid: -O-iV6ZIQh6gk1204Ec1ig
}
And field mapping of several important fields is set as follows:
{
"name": {
"type": "multi_field",
"fields": {
"name": {
"type": "string",
"index": "not_analyzed",
"omit_norms": "true",
"index_options": "docs",
"null_value": ""
},
"analyzed": {
"type": "string",
"index_analyzer": "eng_index_analyzer",
"search_analyzer": "eng_search_analyzer",
"null_value": "",
"include_in_all": "false"
}
}
}
}
When I request the name.analyzed field, it works fine for anything containing at least two characters. For example, a query “Ra” will find documents with “Rafael” in the name field. However, when I request "R" or "Rafael S", it does not return any result. It should be noted that in our query, spaces are treated as an "AND" operator, and not as "OR", therefore, basically the term of a query is processed as "name contains [search query]".
How to set up a field or analyzer so that single letter search works?