我想使用NEST库的Fluent接口创建索引,该索引涉及设置自定义过滤器,分析器和类型映射。我想避免用NEST专用的注解修饰我的课程。
我在http://nest.azurewebsites.net/indices/create- indices.html和 http://nest.azurewebsites.net/indices/put- mapping.html上看到了文档。该文档虽然显示了一些示例,但还不够完整,无法帮助我弄清楚如何使用Fluent API构建一些复杂的索引方案。
我发现该教程在http://euphonious-intuition.com/2012/08/more-complicated-mapping-in- elasticsearch/中很有帮助;一些显示如何在本教程中通过NEST Fluent接口代替纯JSON构建筛选器,分析器和映射的代码将很好地回答这个问题。
您对问题的回答越具体,所获得的答案就越好。不过,这里有一个索引,该索引设置了一个分析器(带有过滤器)和令牌生成器(EdgeNGram),然后使用它们在Tag类的Name字段上创建自动完成索引。
public class Tag { public string Name { get; set; } } Nest.IElasticClient client = null; // Connect to ElasticSearch var createResult = client.CreateIndex(indexName, index => index .Analysis(analysis => analysis .Analyzers(a => a .Add( "autocomplete", new Nest.CustomAnalyzer() { Tokenizer = "edgeNGram", Filter = new string[] { "lowercase" } } ) ) .Tokenizers(t => t .Add( "edgeNGram", new Nest.EdgeNGramTokenizer() { MinGram = 1, MaxGram = 20 } ) ) ) .AddMapping<Tag>(tmd => tmd .Properties(props => props .MultiField(p => p .Name(t => t.Name) .Fields(tf => tf .String(s => s .Name(t => t.Name) .Index(Nest.FieldIndexOption.not_analyzed) ) .String(s => s .Name(t => t.Name.Suffix("autocomplete")) .Index(Nest.FieldIndexOption.analyzed) .IndexAnalyzer("autocomplete") ) ) ) ) ) );
在github上的NEST的单元测试项目中,还有一个相当完整的映射示例。 https://github.com/elasticsearch/elasticsearch- net/blob/develop/src/Tests/Nest.Tests.Unit/Core/Map/FluentMappingFullExampleTests.cs
编辑:
要查询索引,请执行以下操作:
string queryString = ""; // search string var results = client.Search<Tag>(s => s .Query(q => q .Text(tq => tq .OnField(t => t.Name.Suffix("autocomplete")) .QueryString(queryString) ) ) );