NEST搜索所有可用对象

时间:2017-11-29 12:04:12

标签: .net elasticsearch nest

我已经开始使用NEST为Elasticsearch编写一个小实用程序,并且之前没有使用Elastic API的经验。虽然我已经尝试过我的研究,但我发现了一些简单的代码,无法理解他们应该如何运作。

我想做什么:只查找具有特定字段值的对象。例如,我将从Quick Start Guide

中获取修改过的Person类
  public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string FavoriteColor {get; set; }
        public string TimeAdded {get; set; }
    }

我有索引people_dd_mm_yyy,所以我无法设置默认索引,因为它每天都会更新。

另外,我不知道哪些人会参与索引,所以我只是想看看,让我们说,今天人们加入并找到所有喜欢红色的人。

        var p = new Person();
        var indexResponse = client.Index(p,s => s.Index("people_*"));
        var search = client.Search<Person>(s => s
        .From(0)
        .Size(10)
        .Query(q => q
        .Match(m => m
        .Field(f => f.FavoriteColor)
        .Query("Red"))));

搜索无法找到任何内容,因为搜索文档中的所有字段都将为空。 如何将所有对象编入索引而不管其内容如何?好的,我知道我希望所有对象都有FavoriteColor = Red,所以我可以写

 var p = new Person() { FavoriteColor = "Red"};

但我不知道其他字段是什么,我如何让Elastic填充它们作为回应?

似乎我无法理解在Elastic中索引和搜索引擎的想法。

我想我正在尝试body search,但github上有此请求的示例也要求我了解有关我要搜索的对象的所有内容。

1 个答案:

答案 0 :(得分:2)

首先,如果你想搜索多个索引,你应该在查询中指定它(检查这个伟大的limitations

client.Search<Person>(s => s
        .Index("people_*")...

其次,如果您有兴趣找到偏好颜色为红色的所有人,我会使用Term而不是Match。 术语将对Red进行过滤,而Match将进行全文搜索,并在字段中查找Red的出现次数。 如果我能够尽可能简单地解释这一点,我会将它们与SQL进行比较,其中Match是SQL“LIKE”,Term是SQL“=”。 在大型文件中,术语很可能是最快的选择。

建议的解决方案:

var search = client.Search<Person>(s => s
        .Index("people_*")
        .From(0)
        .Size(10)
        .Term(q => q
        .Field(p => p.FavoriteColor)
        .Value("Red")));