Синонимы гнезда Elasticssearch 2.XX

#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")) .

Надеюсь, это вам поможет.