Elasticsearch поиск числа в виде строки - PullRequest
0 голосов
/ 18 июня 2020

У меня есть объект - Organization со свойством int Number, которое я хотел бы искать как строку, например, строка поиска 12 вернет организации с Number = 12 или Number = 5123 et c ... Теперь, если я установил searchStr = "123", будут результаты, в которых 123 содержится во всех полях, но поиск нечисловых c символов, например, "goo" завершается ошибкой с System.Exception: Invalid elasticSearch response

Это объект организации:

public class Organization
{
    public int? Id { get; set; }
    public string Name { get; set; }
    public string SecondName { get; set; }
    public int Number { get; set; }
}

И код, создающий индекс:

var indexState = new IndexState();
var indexSettings = new IndexSettings();
indexSettings.Analysis = new Analysis();
indexSettings.Analysis.Analyzers = new Analyzers();

var customAnalyzer = GetStandardAsciifoldingAnalyzer();

indexSettings.Analysis.Analyzers.Add(STANDARD_ASCIIFOLDING_ANALYZER_NAME, customAnalyzer);

indexState.Settings = indexSettings;

var response = await _elasticClient.Indices.CreateAsync(indexName, index => index
    .InitializeUsing(indexState).Map<Organization>(
        x => x.Properties(ps => ps
            .Number(s => s
                .Name(n => n.Id)
                .Type(NumberType.Integer)
            )
            .SearchAsYouType(s => s
                .Name(n => n.Name)
                .Analyzer(STANDARD_ASCIIFOLDING_ANALYZER_NAME)
            )
            .Text(s => s
                .Name(n => n.SecondName)
                .Fields(f => f
                    .Text(tt => tt
                        .Name("ngram")
                        .Analyzer("ngram_analyzer")
                    )
                )
            )
            .Text(s => s
                .Name(n => n.Number.ToString())
                .Fields(f => f
                    .Text(tt => tt
                        .Name("ngram")
                        .Analyzer("ngram_analyzer")
                    )
                )
            )
        )
    )
);

Вот поисковый «запрос»:

string searchStr=  "123";
ISearchResponse<Organization> searchResponse = await _elasticClient.SearchAsync<Organization>(s => s
                                    .Index(indexName)
                                    .Query(q => q
                                        .Bool(b => b
                                            .Must(c => c
                                                .MultiMatch(mm => mm
                                                    .Query(searchStr)
                                                    .Type(TextQueryType.BoolPrefix)
                                                    .Fields(f => f
                                                           .Field(p => p.Name, 3)
                                                           .Field("name._2gram", 3)
                                                           .Field("name._3gram", 3)
                                                           .Field(p => p.SecondName, 2)
                                                           .Field("secondName._2gram", 2)
                                                           .Field("secondName._3gram", 2)
                                                        .Field(p => p.Number, 1)
                                                    .Field("number._2gram", 1)
                                                    .Field("number._3gram", 1)
                                                    )
                                                    .Operator(Operator.Or)
                                                )
                                            )
                                            )
                                    )
                                    .Size(limit)
                                    );

Любая помощь будет принята с благодарностью.

...