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