#elasticsearch #nest #synonym
#elasticsearch #гнездо #синоним
Вопрос:
Я новичок в elasticsearch, и мы оцениваем elasticsearch для нашего интернет-магазина. Одной из важных особенностей является использование синонимов. К сожалению, я не могу создать индекс с синонимами. Пожалуйста, кто-нибудь может мне помочь, как я могу использовать функцию синонимов. Я не нашел ни одного примера для этой функции и elasticsearch 2.xx. Цель должна заключаться в том, чтобы, если я буду искать холмы, запись Royal будет найдена.
Я использую следующий код:
private ElasticClient GetClient()
{
var node = new Uri(ES_URI);
var uri = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(uri).DefaultIndex("product");
var client = new ElasticClient(settings);
return client;
}
public void CreateSynonymIndex()
{
Product product = new Product()
{
Id = "2",
ProductName = "Royal",
Description = "Katzenfutter für Nierkranke"
};
var client = GetClient();
client.DeleteIndex("product");
var syn = new[] { "royal, hills => royal" };
ICreateIndexResponse respose = client.CreateIndex("product", c => c
.Mappings(mp => mp.Map<Product>(d => d.
Properties(p => p.String(n => n.Name(name => name.ProductName).Index(FieldIndexOption.Analyzed)))))
.Settings(s => s
.Analysis(an => an
.Tokenizers(at=>at.Pattern("synonymTokenizer",pa=>pa.Pattern("Test")))
.Analyzers(a=>a.Custom("synonymAnalyser",ca =>ca
.Tokenizer("synonymTokenizer")
.Filters(new List<string> { "synonym" })))
.TokenFilters(tf => tf
.Synonym("synonym", sy => sy.Synonyms(syn)
.Tokenizer("whitespace")
.IgnoreCase(true)))))
);
client.Index(product);
}
public void ES_Search()
{
var client = GetClient();
var response = client.Search<Product>(search => search
.Query(q => q.Bool(b => b
.Should(
// s => s.Match(m => m.Query("sometest").Field(f => f.ProductName).Boost(1.1)),
s => s.Match(m => m.Query("hills").Field(f => f.ProductName).Fuzziness(Fuzziness.EditDistance(1)))
))));
var response1 = client.Search<Product>(s => s.Query(q => q.Term(p => p.ProductName, "hills")));
}
С уважением,
Доминик
Комментарии:
1. Используете ли вы NEST 2.x?
2. Привет, я использую NEST V 2.4.6. Мне нужен рабочий образец для поиска по синонимам.
Ответ №1:
Вы создали анализатор с синонимами, но вы им не пользуетесь. Вам нужно сообщить elasticsearch, что ProductName
поле должно использовать synonymAnalyser
analyzer.
.Mappings(mp => mp.Map<Product>(d => d.
Properties(p => p.String(n => n
.Name(name => name.ProductName)
.Analyzer("synonymAnalyser")
.Index(FieldIndexOption.Analyzed)))))
Я заметил еще несколько вещей, хотя:
-
помните, что документ не сразу доступен в elasticsearch после вызова
client.Index(..)
метода. Это займет несколько миллисекунд. При поиске сразу после индексации документа вы можете его не найти. Подробнее об этом можно прочитать здесь -
Я не знаю, создаете ли вы
ElasticClient
с индексом по умолчанию, потому что вы им не поделились. Если нет, вам нужно будет указать его в своих поисковых вызовах, напримерclient.Search<Product>(s => s.Index("product"))
.
Надеюсь, это вам поможет.