Мне неясно: должен ли анализатор снежного кома использоваться при создании индекса?
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 в какой-то момент изменился.