Пользовательский анализатор NEST NGram не возвращает правильный результат

Пытаясь создать функцию автозаполнения, я думаю, что она работает, но я замечаю, что мой собственный анализатор иногда выдает странные результаты.

var response = this.client.CreateIndex(
                    ElasticConfig.IndexName,
                    index => index
                        .Mappings(
                            ms => ms.Map<EmployeeDocument>(
                                m => m.Properties(
                                    p => p
                                        .Text(t => t.Name(n => n.EmpFirstName).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword"))))
                                        .Text(t => t.Name(n => n.pkEmpID).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword"))))
                                        .Text(t => t.Name(n => n.Description).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword")))))))
                            .Settings(
                            f => f.Analysis(
                                    analysis => analysis
                                    .Tokenizers(
                                        tokenizers => 
                                        tokenizers
                                            .EdgeNGram("ngram", t => t.MinGram(3).MaxGram(5)))
                                   .Analyzers(
                                        analyzers => analyzers.Custom(
                                            "auto-complete",
                                            a => a.Filters(new List<string> { "lowercase", "ngram" }).Tokenizer("standard")))))); 

если я позвоню

127.0.0.1:9200/default-index/_analyze?text=dan&analyzer=auto-complete

тогда я получаю

{
    "tokens": [
        {
            "token": "d",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "da",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "a",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "an",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "n",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}

Я установил свой MinGram на 3, поэтому вышеизложенное определенно неверно, я пропустил настройку?


person R4nc1d    schedule 21.11.2017    source источник


Ответы (1)


Итак, я изменил способ создания своих токенов. Обратите внимание, как я использую TokenFilters вместо Tokenizers

var response = this.client.CreateIndex(
                    ElasticConfig.IndexName,
                    index => index.Mappings(
                        ms => ms.Map<EmployeeDocument>(
                            m => m.Properties(
                                p => p
                                    .Text(t => t.Name(n => n.EmpFirstName).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword"))))
                                    .Text(t => t.Name(n => n.pkEmpID).Analyzer("auto-complete-id").Fields(ff => ff.Keyword(k => k.Name("keyword"))))
                                    .Text(t => t.Name(n => n.Description).Analyzer("auto-complete").Fields(ff => ff.Keyword(k => k.Name("keyword")))))))
                        .Settings(f => f.Analysis(
                            analysis => analysis
                                .Analyzers(
                                    analyzers => analyzers
                                        .Custom("auto-complete", a => a.Tokenizer("standard").Filters("lowercase", "auto-complete-filter"))
                                        .Custom("auto-complete-id", a => a.Tokenizer("standard").Filters("lowercase", "auto-complete-id-filter")))
                                        .TokenFilters(tokenFilter => tokenFilter
                                                                    .EdgeNGram("auto-complete-filter", t => t.MinGram(3).MaxGram(5))
                                                                    .EdgeNGram("auto-complete-id-filter", t => t.MinGram(1).MaxGram(5))))));
person R4nc1d    schedule 22.11.2017