Пример использования синонимов в гнезде
Я не нашел надежного примера того, как создавать и использовать синонимы с помощью Nest для Elasticsearch. если у кого-то есть, это было бы полезно.
моя попытка выглядит так, но я не знаю, как применить ее к полю.
var syn = new SynonymTokenFilter
{
Synonyms = new [] { "pink, p!nk => pink", "lil, little", "ke$ha, kesha => ke$ha" },
IgnoreCase = true,
Tokenizer = "standard"
};
client.CreateIndex("myindex", i =>
{
i
.Analysis(a => a.Analyzers(an => an
.Add("fullTermCaseInsensitive", fullTermCaseInsensitive)
)
.TokenFilters(x => x
.Add("synonym", syn)
)
)
...
2 ответа
Решение
Предполагая ваш fullTermCaseInsensitive
Анализатор настраиваемый, вам нужно добавить к нему фильтр синонимов:
var fullTermCaseInsensitive = new CustomAnalyzer()
{
.
.
.
Filter = new string[] { "syn" }
};
И после создания вашего индекса вы можете добавить отображение и применить fullTermCaseInsensitive
анализатор в вашей области (областях):
client.CreateIndex("myindex", c => c
.Analysis(a => a
.Analyzers(an => an.Add("fullTermCaseInsensitive", fullTermCaseInsensitive))
.TokenFilters(tf => tf.Add("syn", syn)))
.AddMapping<MyType>(m => m
.Properties(p => p
.String(s => s.Name(t => t.MyField).Analyzer("fullTermCaseInsensitive")))));
Это очень просто:) вам нужно сначала определить фильтр синонимов, который вы можете использовать в своем пользовательском анализаторе... где вы можете добавить и другие типы фильтров. Небольшой пример:
.Analysis(descriptor => descriptor
.Analyzers(bases => bases
.Add("folded_word", new CustomAnalyzer()
{
Filter = new List<string> { "icu_folding", "trim", "synonym" },
Tokenizer = "standard"
}
)
)
.TokenFilters(i => i
.Add("synonym", new SynonymTokenFilter()
{
SynonymsPath="analysis/synonym.txt",
Format = "Solr"
}
)
)
Затем вы можете использовать пользовательский анализатор в части отображения