Как использовать анализатор снежного кома с NEST и ElasticSearch? - PullRequest
0 голосов
/ 04 октября 2018

Мне неясно: должен ли анализатор снежного кома использоваться при создании индекса?

var Client = new ElasticClient(Settings);
Client.CreateIndex("pictures", i => i
    .Settings(st => st
        .Analysis(a => a
            .Analyzers(ad => ad
                .Snowball("snowball", s => s.Language(SnowballLanguage.English))
            )
        )
    )
);

или при поиске?

var queryResults = Client.Search<PictureIndex>(s => s
    .From(0).Size(10)
    .Query(q=>q
        .QueryString(qs=>qs
            .Analyzer("snowball")
            .Query("my test string")
         )
    )
);

Этот код не возвращаетсяожидаемые результаты.

Например, если у меня есть:

  • помидор и
  • помидор

в моем индексе, яЯ ожидаю найти 2 результата, если я буду искать помидор, но это не так.

Я пытаюсь сделать только английский, нечувствительный к регистру поиск в стволе и добавить нечеткость для размещения орфографических ошибок.

(В качестве бонуса я хотел бы иметь возможность представить список синонимов)


Редактировать: это тестовый код, который у меня есть, но я думаю, что неправильно понимаю, как вводить синонимы,Код не вернет совпадений.

public static class Program
{
    public class IndexData
    {
        public int Id { get; set; }
        public string Text { get; set; }
    }

    public static void Main()
    {
        var Settings = new ConnectionSettings(new Uri("http://elasticsearch:9200")).DefaultIndex("testindex");

        var A = new List<IndexData>
        {
            new IndexData { Id = 11, Text = "I like red, green and blue. But also cookies and candies" },
            new IndexData { Id = 12, Text = "There is a red cookie on the shelf" },
            new IndexData { Id = 13, Text = "Blue candies are my favorite" }
        };

        var Client = new ElasticClient(Settings);

        var D = Client.DeleteIndexAsync("testindex").Result;

        var U = Client.CreateIndex("testindex", i => i
            .Settings(s => s
                .Analysis(a => a
                    .CharFilters(cf => cf
                        .Mapping("my_char_filter", m => m
                            .Mappings("Blue => blue", "Red => red", "Green => green")
                        )
                    )
                    .TokenFilters(tf => tf
                        .Synonym("my_synonym", sf => sf
                            .Synonyms("red, blue")
                            .Synonyms("green, blue")

                        )
                    )
                    .Analyzers(an => an
                        .Custom("my_analyzer", ca => ca
                            .Tokenizer("standard")
                            .CharFilters("my_char_filter")
                            .Filters("lowercase", "stop", "my_synonym")
                        )
                    )
                )
            )
        );

        var R = Client.IndexDocument(A[0]);
        R = Client.IndexDocument(A[1]);
        R = Client.IndexDocument(A[2]);

        var Articles = Client.Search<IndexData>(s => s
            .From(0)
            .Size(1000)
            .Analyzer("my_analyzer")
            .Query(q => q.Fuzzy(fz => fz.Field("text").Value("blue").MaxExpansions(2)))
        );

        var Documents = Articles.Documents;
    }
}

Я пытаюсь добиться текстового поиска, где:

  • У меня могут быть небольшие ошибки
  • Дескриптормножественное число: помидор = помидоры
  • Я могу определить синонимы (например, здесь я ожидаю, что поиск «синий» вернет также «красный» и «зеленый»)
  • Получить отсортированныйсписок матчей с лучшими хитами первым.Под лучшими я подразумеваю хиты, которые охватывают больше поисковых терминов.

Я должен признать, что, несмотря на просмотр документов, меня крайне смущает терминология и ход всей системы.Другая проблема заключается в том, что половина примеров в Интернете просто не компилируется, поскольку похоже, что API в какой-то момент изменился.

...