弹性搜索不使用 Nest 返回文档
Elastic-search not returning documents using Nest
我对 ElasticSearch
很陌生。
我无法使用 ElasticSearch
进行搜索 我尝试了几种方法,但似乎没有任何效果。
If i use sense chrome toolkit Sense extension for chrome and query this GET /employee/_search?q=FirstName="Eldho"
It is working Fine.
我已经看过这个answer,对我也不起作用。
无法使用 Nest 进行搜索
protected ElasticClient Client;
IndexName index = "employee";
public ElasticSearchRepository(Uri elasticServerUri)
{
var connection = new ConnectionSettings(elasticServerUri).DefaultIndex("employee");
this.Client = new ElasticClient(connection);
}
//This is how i create Index
public void CreateIndex()
{
var settings = new IndexSettings();
settings.NumberOfReplicas = 1;
settings.NumberOfShards = 1;
var indexstate = new IndexState();
indexstate.Settings = settings;
Client.CreateIndex(index, g => g.Index(index)
.InitializeUsing(indexstate)
.Mappings(j => j.Map<Employee>(h => h.AutoMap(1))));
}
public List<Employee> Search(string search)
{
//All 3 searches are not wokring for me
var response = Client.Search<Employee>(s => s
.AllIndices()
.AllTypes()
.From(0)
.Size(10)
.Query(q =>q
.Term(t => t.FirstName, "Eldho")));
var result = Client.Search<Employee>(h => h
.Query(q => q
.Match(m => m.Field("FirstName").Query(search))));
var result2 = Client.Search<Employee>(h => h
.Type("employee")
.Query(k => k
.Term(g => g.FirstName, "Eldho")));
return result.Documents.ToList();
}
请让我知道我做错了什么。
我在您的代码中看不到您正在为任何文档编制索引的任何地方,但我猜您已经为它们编制了索引。
第一次搜索
var response = Client.Search<Employee>(s => s
.AllIndices()
.AllTypes()
.From(0)
.Size(10)
.Query(q =>q
.Term(t => t.FirstName, "Eldho")));
将不匹配,因为您正在使用 term
查询和 "Eldho"
,但是将使用 .AutoMap()
执行的字段映射将默认使用 standard analyzer 在 string
字段上,其中包括小写标记。如果您要使用 "eldho"
更改为 term
查询,我希望找到匹配项。
您的第二次搜索
var result = Client.Search<Employee>(h => h
.Query(q => q
.Match(m => m.Field("FirstName").Query(search))));
不会匹配,因为默认情况下,NEST 在索引、映射、搜索等时使用 属性 名称。因此,您的 POCO 上名为 FirstName
的 属性 将映射到一个字段在该文档类型的映射中命名为 firstName
。
您的第三次搜索
var result2 = Client.Search<Employee>(h => h
.Type("employee")
.Query(k => k
.Term(g => g.FirstName, "Eldho")));
遇到与您第一次搜索相同的问题。
在 NEST 中执行与您在 Sense 中发送的查询相匹配的查询字符串查询
client.Search<Employee>(s => s
.Query(q => q
.QueryString(qs => qs
.Fields(f => f.Field(ff => ff.FirstName))
.Query("Eldho")
)
)
);
如果您使用问题中的连接设置使用 NEST 为文档编制了索引,那么这应该可以工作,尽管我注意到在您的 Sense 查询中您使用字段 "FirstName"
获得了结果。要更改 field inference in NEST 使其不采用驼峰式 field/property 名称,我们可以使用
var settings = new ConnectionSettings(elasticServerUri)
.DefaultFieldNameInferrer(p => p);
var client = new ElasticClient(settings);
我对 ElasticSearch
很陌生。
我无法使用 ElasticSearch
进行搜索 我尝试了几种方法,但似乎没有任何效果。
If i use sense chrome toolkit Sense extension for chrome and query this
GET /employee/_search?q=FirstName="Eldho"
It is working Fine.
我已经看过这个answer,对我也不起作用。
无法使用 Nest 进行搜索
protected ElasticClient Client;
IndexName index = "employee";
public ElasticSearchRepository(Uri elasticServerUri)
{
var connection = new ConnectionSettings(elasticServerUri).DefaultIndex("employee");
this.Client = new ElasticClient(connection);
}
//This is how i create Index
public void CreateIndex()
{
var settings = new IndexSettings();
settings.NumberOfReplicas = 1;
settings.NumberOfShards = 1;
var indexstate = new IndexState();
indexstate.Settings = settings;
Client.CreateIndex(index, g => g.Index(index)
.InitializeUsing(indexstate)
.Mappings(j => j.Map<Employee>(h => h.AutoMap(1))));
}
public List<Employee> Search(string search)
{
//All 3 searches are not wokring for me
var response = Client.Search<Employee>(s => s
.AllIndices()
.AllTypes()
.From(0)
.Size(10)
.Query(q =>q
.Term(t => t.FirstName, "Eldho")));
var result = Client.Search<Employee>(h => h
.Query(q => q
.Match(m => m.Field("FirstName").Query(search))));
var result2 = Client.Search<Employee>(h => h
.Type("employee")
.Query(k => k
.Term(g => g.FirstName, "Eldho")));
return result.Documents.ToList();
}
请让我知道我做错了什么。
我在您的代码中看不到您正在为任何文档编制索引的任何地方,但我猜您已经为它们编制了索引。
第一次搜索
var response = Client.Search<Employee>(s => s
.AllIndices()
.AllTypes()
.From(0)
.Size(10)
.Query(q =>q
.Term(t => t.FirstName, "Eldho")));
将不匹配,因为您正在使用 term
查询和 "Eldho"
,但是将使用 .AutoMap()
执行的字段映射将默认使用 standard analyzer 在 string
字段上,其中包括小写标记。如果您要使用 "eldho"
更改为 term
查询,我希望找到匹配项。
您的第二次搜索
var result = Client.Search<Employee>(h => h
.Query(q => q
.Match(m => m.Field("FirstName").Query(search))));
不会匹配,因为默认情况下,NEST 在索引、映射、搜索等时使用 属性 名称。因此,您的 POCO 上名为 FirstName
的 属性 将映射到一个字段在该文档类型的映射中命名为 firstName
。
您的第三次搜索
var result2 = Client.Search<Employee>(h => h
.Type("employee")
.Query(k => k
.Term(g => g.FirstName, "Eldho")));
遇到与您第一次搜索相同的问题。
在 NEST 中执行与您在 Sense 中发送的查询相匹配的查询字符串查询
client.Search<Employee>(s => s
.Query(q => q
.QueryString(qs => qs
.Fields(f => f.Field(ff => ff.FirstName))
.Query("Eldho")
)
)
);
如果您使用问题中的连接设置使用 NEST 为文档编制了索引,那么这应该可以工作,尽管我注意到在您的 Sense 查询中您使用字段 "FirstName"
获得了结果。要更改 field inference in NEST 使其不采用驼峰式 field/property 名称,我们可以使用
var settings = new ConnectionSettings(elasticServerUri)
.DefaultFieldNameInferrer(p => p);
var client = new ElasticClient(settings);