我想使用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构建过滤器,分析器和映射,这将是这个问题的一个很好的答案。
答案 0 :(得分:9)
您的问题越具体,您收到的答案就越好。不过,这里有一个索引,用于设置分析器(带过滤器)和标记化器(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")
)
)
)
)
)
);
NEST在github上的单元测试项目中还有一个相当完整的映射示例。 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)
)
)
);