user6411097
user6411097

Reputation: 23

Can I have multiple filters in an Elasticsearch index's settings?

I want an Elasticsearch index that simply stores "names" of features. I want to be able to issue phonetic queries and also type-ahead style queries separately. I would think I would be able to create one index with two analyzers and two filters; each analyzer could use one of the filters. But I do not seem to be able to do this.

Here is the index settings json I'm trying to use:

{
    "settings": {
        "number_of_shards": 1,
        "analysis": {
            "analyzer": {
                "autocomplete_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["standard", "lowercase", "ngram"]
                }
            },
            "analyzer": {
                "phonetic_analyzer": {
                    "tokenizer": "standard",
                    "filter": "double_metaphone_filter"
                }
            },
            "filter": {
                "double_metaphone_filter": {
                    "type": "phonetic",
                    "encoder": "double_metaphone"
                }
            },
            "filter": {
                "ngram": {
                    "type": "ngram",
                    "min_gram": 2,
                    "max_gram": 15
                }
            }
        }
    }
}

When I attempt to create an index with these settings:

http://hostname:9200/index/type

I get an HTTP 400, saying

Custom Analyzer [phonetic_analyzer] failed to find filter under name [double_metaphone_filter]

Don't get me wrong, I fully realize what that sentence means. I looked and looked for an erroneous comma or quote but I don't see any. Otherwise, everything is there and formatted correctly.

If I delete the phonetic analyzer, the index is created but ONLY with the autocomplete analyzer and ngram filter.

If I delete the ngram filter, the index is created but ONLY with the phonetic analyzer and phonetic filter.

I have a feeling I'm missing a fundamental concept of ES, like only one analyzer per index, or one filter per index, or I must have some other logical dependencies set up correctly, etc. It sure would be nice to have a logical diagram or complete API spec of the Elasticsearch infrastructure, i.e. any index can have 1..n analyzers, only 1 filter, query must need any one of bool, match, etc. But that unicorn does not seem to exist.

I see tons of documentation, blog posts, etc on how to do each of these functionalities, but with only one analyzer and one filter on the index. I'd really like to do this dual functionality on one index (for reasons out of scope).

Can someone offer some help, advice here?

Upvotes: 2

Views: 2318

Answers (1)

IanGabes
IanGabes

Reputation: 2797

You are just missing the proper formatting for your settings object. You cannot have two analyzer or filter keys, as there can only be one value per key in this settings map object. Providing a list of your filters seems to work just fine. When you were creating your index object, the second key was overriding the first.

Look here:

"settings": {
    "number_of_shards": 1,
    "analysis": {
        "filter": {
            "double_metaphone_filter": {
                "type": "phonetic",
                "encoder": "double_metaphone"
            },
            "ngram": {
                "type": "ngram",
                "min_gram": 2,
                "max_gram": 15
            }
        },
        "analyzer": {
            "autocomplete_analyzer": {
                "type": "custom",
                "tokenizer": "standard",
                "filter": ["standard", "lowercase", "ngram"]
            },
            "phonetic_analyzer": {
                "tokenizer": "standard",
                "filter": "double_metaphone_filter"
            }
        }
    }
}

I downloaded the plugin to confirm this works. You can now test this out at the _analyze enpoint with a payload:

{
    "analyzer":"autocomplete_analyzer",
    "text":"Jonnie Smythe"
}

Upvotes: 7

Related Questions