2
votes

My NEST code which used to work with Elasticsearch version 6, is throwing the following error with Elastichsearch version 7:

Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters:

I have seen this question which explain mapping types are deprecated in ES 7... I am not sure if this my problem or not? How can resolve this issue?

This is my code for generating index:

var createIndexResponse = ElasticClient.CreateIndex(IndexName, c => c
    .Settings(st => st
        .Analysis(an => an
            .Analyzers(anz => anz
                .Custom("result_suggester_analyzer", rsa => rsa
                    .Tokenizer("standard")
                    .CharFilters("html_strip", "mapped_words_char_filter")
                    .Filters(new string[] { "english_possessive_stemmer", "lowercase", "asciifolding", "stop_words", "english_stemmer", "edge_ngram_token_filter", "unique" })
                )
                .Custom("custom_english_analyzer", ce => ce
                    .Tokenizer("standard")
                    .CharFilters("html_strip", "mapped_words_char_filter")
                    .Filters(new string[] { "english_possessive_stemmer", "lowercase", "asciifolding", "stop_words", "english_stemmer", "unique" })
                )
            )
            .Normalizers(nor => nor
                .Custom("custom_ignore_case_normalizer", icn => icn
                    .CharFilters("mapped_words_char_filter")
                    .Filters(new string[] { "lowercase", "asciifolding" })
                )
            )
            .CharFilters(cf => cf
                .Mapping("mapped_words_char_filter", md => md
                    .Mappings(
                        "C# => csharp"
                    )
                )
            )
            .TokenFilters(tfd => tfd
                .EdgeNGram("edge_ngram_token_filter", engd => engd
                    .MinGram(2)
                    .MaxGram(10)
                )
                .Stop("stop_words", sfd => sfd.StopWords(_stopWords))
                .Stemmer("english_stemmer", esd => esd.Language("english"))
                .Stemmer("english_possessive_stemmer", epsd => epsd.Language("possessive_english"))
            )
        )
    )
    .Mappings(m => m.Map<AdDocument>(d => d.AutoMap()))); 

This is MyDocument

[ElasticsearchType(Name = "ad")]
public class AdDocument
{
    public long Id { get; set; }

    [Text(Analyzer = "custom_english_analyzer", SearchAnalyzer = "custom_english_analyzer")]
    public string FirstName { get; set; }

    // searchable properties from AdBase
    public bool IsActive { get; set; }

    [Text(Analyzer = "custom_english_analyzer", SearchAnalyzer = "custom_english_analyzer")]
    public string Title { get; set; }

    public short AdDurationInDays { get; set; }

    public DateTime AdStartTime { get; set; }

    [Keyword(Index = false)]   // Keyword => not analyzed
    public string MainPhotoUrl { get; set; }

    [Text(Analyzer = "custom_english_analyzer", SearchAnalyzer = "custom_english_analyzer")]
    public string StoreName { get; set; }

    // searchable properties from Address
    public GeoLocation GeoLocation { get; set; }

    [Keyword(Normalizer = "custom_ignore_case_normalizer")]   // keywords => not analyzed, use ignore case normalizer otherwise search would be case sensitive
    public string Suburb { get; set; }

    // Price is used when something is being sold, in case of real estate rental it indicates the rent value, in case of Jobs it is not used (we use salary) and services have not price
    public decimal? Price { get; set; }

    public DateTime? AvailableFrom { get; set; }

    public bool? IsFurnished { get; set; }

    public long? LandArea { get; set; }

    public short? JobTypeId { get; set; }
}

And this is the response (error) from Elasticsearch:

Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters:

[ad : {
    properties= {
        landArea={
            type=long
        }, 
        isFurnished={
            type=boolean
        }, isActive={
            type=boolean
        }, title={
            search_analyzer=custom_english_analyzer, 
            analyzer=custom_english_analyzer, 
            type=text
        }, 
        availableFrom={
            type=date
        }, 
        mainPhotoUrl={
            index=false, 
            type=keyword
        }, 
        price={
            type=double
        }, 
        storeName={
            search_analyzer=custom_english_analyzer, 
            analyzer=custom_english_analyzer, 
            type=text
        }, 
        id={
            type=long
        }, 
        firstName={
            search_analyzer=custom_english_analyzer, 
            analyzer=custom_english_analyzer, 
            type=text
        }, 
        geoLocation={
            type=geo_point
        }
    }
}]
1
You cant use your Nest elastic client with an elastic 7 Cluster. There is some breaking change with the removal of types. Mapping does not allow anymore to specify a type It seems that an alpha exists for version 7 for the official elastic client: see here: github.com/elastic/elasticsearch-net/tree/7.xPierre Mallet
@PierreMallet: thanks a lot. So ES 7 in out, but there is not support for it using NEST (NEST 7 is on alpha)? Sound like my most sensible option is to downgrade my Elasticsearch server back to to version 6?Hooman Bahreini
I think so. But im a not a nest user. Maybe someone else could confirm my thoughtsPierre Mallet
Thanks... I think you are right... I downgraded my ES to 6.8 and it started to work again.Hooman Bahreini

1 Answers

0
votes

You used to work with Elasticsearch version 6, And now using version 7.

I think your cloud Elasticsearch client version is still version 6. This is causing your error. In Elasticsearch 7, mapping types have been removed. https://www.elastic.co/guide/en/elasticsearch/reference/6.5/removal-of-types.html

Upgrade your cloud also to version 7.