У меня есть объект - 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)
);
Любая помощь будет принята с благодарностью.