elasticsearch ElasticSearch(嵌套)按编号搜索,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch ElasticSearch(嵌套)按编号搜索,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch ElasticSearch(嵌套)按编号搜索

elasticsearch ElasticSearch(嵌套)按编号搜索,elasticsearch,nest,elasticsearch,Nest,如果这是一个基本问题,我提前表示歉意-我对ElasticSearch非常陌生,需要了解很多 现在,我正在尝试实现一个基本的关键字搜索,搜索所有索引列,并通过一个特定字段,Year得到一些奇怪的结果。我知道有一定数量的文档应该从结果中返回,如果我搜索“2014”,所有文档都会成功返回。如果我只搜索“14”,什么也不会返回,如果我添加了一个通配符(例如,*14),那么我会返回一个结果,因为它在搜索中没有使用年份,而是从描述字段中提取它 我百分之百肯定这是我在查询结构上犯的错误,有什么建议吗?顺便说一

如果这是一个基本问题,我提前表示歉意-我对ElasticSearch非常陌生,需要了解很多

现在,我正在尝试实现一个基本的关键字搜索,搜索所有索引列,并通过一个特定字段,
Year
得到一些奇怪的结果。我知道有一定数量的文档应该从结果中返回,如果我搜索“2014”,所有文档都会成功返回。如果我只搜索“14”,什么也不会返回,如果我添加了一个通配符(例如,
*14
),那么我会返回一个结果,因为它在搜索中没有使用
年份
,而是从
描述
字段中提取它

我百分之百肯定这是我在查询结构上犯的错误,有什么建议吗?顺便说一句,如果有人能提供建议的地方来学习更多关于Elastic with NEST的知识,那将是非常有帮助的。他们的文档有点缺乏,您必须了解如何使用Elastic,因为大部分内容都是有意义的,因为我没有,所以我只能蹒跚而行

以下是ElasticList的结构:

    public long Id { get; set; }

    public string Brand { get; set; }

    public string Manufacturer { get; set; }

    public string ActiveTags { get; set; }

    public string Description { get; set; }

    public int Year { get; set; }

    public string Location { get; set; }
我在NEST中使用的搜索结构是这样的,
关键字
将是“2014”(无引号):

var response=this.ElasticClient.Search(s=>s
.AllTypes()
.Query(Query=>Query
.Bool(b=>b
.Must(Must=>Must
.QueryString(qs=>qs.Query(关键字))
)
)                   
)
.Size(页面大小)
.解释
);

您希望在Elasticsearch中的
年份
字段上执行
术语
查询

var response = client.Search<ElasticListing>(s => s
    .AllTypes()
    .Query(query => query
        .Term(f => f.Year, 2014)
    )
    .Size(pageSize)
    .Explain()
);

太棒了-谢谢你!看起来搜索需要通配符,但除此之外,这完全符合我的需要;对于一些查询,认为它们类似于在关系数据库中执行表扫描。如果希望在<代码>年<代码>字段中频繁执行这些查询,请考虑将其创建为<代码>文本< /代码>数据类型,并对期望执行的查询类型进行适当的分析。
var response = client.Search<ElasticListing>(s => s
    .AllTypes()
    .Query(query => query
        .Term(f => f.Year, 2014)
    )
    .Size(pageSize)
    .Explain()
);
private static void Main()
{
    var defaultIndex = "listings"; 
    var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
        .DefaultIndex(defaultIndex);

    var client = new ElasticClient(settings);

    // Make this example re-runnable. You likely want to remove this :)
    if (client.IndexExists(defaultIndex).Exists)
        client.DeleteIndex(defaultIndex);     

    client.CreateIndex(defaultIndex, c => c
        .Mappings(m => m
            .Map<ElasticListing>(mm => mm
                .AutoMap()
                .Properties(p => p
                    // override the default inferred mapping for Year
                    .Keyword(k => k
                        .Name(n => n.Year) 
                    )
                )
            )
        )
    );

    client.IndexMany(new [] {
        new ElasticListing { Id = 1, Year = 2012 },
        new ElasticListing { Id = 2, Year = 2013 },
        new ElasticListing { Id = 3, Year = 2014 },
        new ElasticListing { Id = 4, Year = 1014 },      
    });

    client.Refresh(defaultIndex);

    var pageSize = 10;

    // returns only document with Id = 3
    var response = client.Search<ElasticListing>(s => s
        .AllTypes()
        .Query(query => query
            .Term(f => f.Year, 2014)
        )
        .Size(pageSize)
        .Explain()
    );

    // returns documents with Ids = 3 and 4
    response = client.Search<ElasticListing>(s => s
        .AllTypes()
        .Query(query => query
            .Wildcard(f => f.Year, "*14", rewrite:(MultiTermQueryRewrite)null)
        )
        .Size(pageSize)
        .Explain()
    );
}

public class ElasticListing
{
    public long Id { get; set; }
    public string Brand { get; set; }
    public string Manufacturer { get; set; }
    public string ActiveTags { get; set; }
    public string Description { get; set; }
    public int Year { get; set; }
    public string Location { get; set; }
}