一尘不染

需要具体的文档/使用NEST ElasticSearch库构建复杂索引的示例

elasticsearch

我想使用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构建筛选器,分析器和映射的代码将很好地回答这个问题。


阅读 252

收藏
2020-06-22

共1个答案

一尘不染

您对问题的回答越具体,所获得的答案就越好。不过,这里有一个索引,该索引设置了一个分析器(带有过滤器)和令牌生成器(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)
        )
    )
);
2020-06-22