我已经开始使用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上有此请求的示例也要求我了解有关我要搜索的对象的所有内容。
答案 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")));