【发布时间】:2018-09-10 18:19:42
【问题描述】:
调用我的 Rest API 的用户必须能够指定地点类型,然后获得地名建议。
地点类型必须准确,而地点名称搜索会充分利用 elaticsearch 搜索的所有潜力。
我正在使用 NEST(最新的 nuget 版本)和 Elastic 6.4。
我的 Api 有 2 个参数: 1.查询:搜索文本搜索 2. placetypes:数组,用于定义建议中所需的文档“类别”
带有查询参数的地名建议效果很好, 但是我不知道如何添加placetype的条件。
嵌套映射:
return map
.Dynamic(false)
.Properties(props => props
.Keyword(n => n
.Name(p => p.Id))
.Text(n => n
.Name(p => p.PlaceType))
.Completion(n => n
.Name(p => p.PlaceName)
.Analyzer("autocompletion_indexation"))
.Completion(n => n
.Name(p => p.Address)
.Analyzer("autocompletion_indexation"))
.GeoPoint(loc =>
{
loc.Name(location => location.Coordinates);
return loc;
}));
巢分析描述符:
return analysis
.CharFilters(c => c
.HtmlStrip("html_strip")
)
.Tokenizers(t => t
.EdgeNGram("custom_ngram", descriptor =>
{
descriptor.MinGram(2);
descriptor.MaxGram(10);
descriptor.TokenChars(new List<TokenChar> { TokenChar.Letter, TokenChar.Digit });
return descriptor;
}
))
.TokenFilters(tf => tf
.Lowercase("lowercase")
.WordDelimiter("word_delimiter", wd =>wd
.SplitOnNumerics()
.SplitOnCaseChange()
)
.AsciiFolding("asciifolding", af => af
.PreserveOriginal(false)
)
.Elision("elision", e => e
.Articles("l", "d", "o")
)
.Synonym("address_synonym", sy => sy
.Synonyms(GetSynonyms())
.Tokenizer("standard")
.Tokenizer("whitespace")
)
.Stop("french_stop", fs => fs
.StopWords("_french_"))
.Stemmer("french_stemmer", fs => fs
.Language("light_french")
)
)
.Analyzers(an => an
.Custom("autocompletion_indexation", c => c
.Tokenizer("custom_ngram")
.Tokenizer("standard")
.Tokenizer("whitespace")
.CharFilters("html_strip")
.Filters("address_synonym",
"lowercase",
"asciifolding",
"elision",
"word_delimiter",
"stop",
"french_stemmer",
"french_stop")
));
建议/搜索功能:
public Task<List<Place>> SuggestDocuments(CancellationToken cancellationToken, string query, params string[] placeTypes)
{
var search = new SearchDescriptor<Place>()
.From(0)
.Size(10)
.Index(PlaceDataService.DefaultPostalAddressIndexName)
.Query(q => q
.MultiMatch(mm => mm
.Query(query)
.Fuzziness(Fuzziness.Auto)
.Fields(fields => fields
.Field(f => f.PlaceName)
)));
var searchResults = _elasticClient.SearchAsync<Place>(search, cancellationToken);
return Task.Run(() => searchResults.Result.Documents.ToList(), cancellationToken);
}
【问题讨论】:
标签: c# elasticsearch nest search-suggestion