在Elastic Search NEST中的主MultiMatch查询之后应用不同的过滤器
本文关键字:之后 应用 过滤器 查询 Search Elastic NEST MultiMatch | 更新日期: 2023-09-27 17:59:32
所以,这是我的查询:
_elasticClient.Search<SearchItem>(x =>
x.Sort(sort).Size(itemsPerPage)
.Query(q =>
q.MultiMatch(m => m
.Fields(fs => fs
.Field(p => p.Field1)
.Field(p => p.Field2)
.Field(p => p.Field3)
.Field(p => p.Field4)
.Field(p => p.Field5)
.Field(p => p.Field6)
)
.Operator(Operator.And)
.Query(pattern)
)));
我必须应用不同的过滤器。范围过滤器(针对价格),过滤器结果集,其中field1="奥迪",field2="销售车"。我试着做这样的事情:
.Query(q =>
q.MultiMatch(m => m
.Fields(fs => fs
Field(p => p.Field1)
.Field(p => p.Field2)
.Field(p => p.Field3)
.Field(p => p.Field4)
.Field(p => p.Field5)
.Field(p => p.Field6)
)
.Operator(Operator.And)
.Query(pattern)))
.Query(q=>q.Range(ra=>ra.Field(ff=>ff.SalePrice).GreaterThan(1000))));
但这是行不通的。我已经从价格大于1000的指数中得到了所有结果,但只需要搜索结果。有人能帮我吗?
您可以使用bool
查询来组合查询,而NEST通过重载运算符来组合QueryContainer
s(根查询类型),使这一点更容易使用。以下是NEST2.x 的示例
void Main()
{
var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(connectionPool);
var client = new ElasticClient(settings);
var itemsPerPage = 20;
var pattern = "match query";
client.Search<SearchItem>(x => x
.Sort(so => so
.Descending("_score")
)
.Size(itemsPerPage)
.Query(q => q
.MultiMatch(m => m
.Fields(fs => fs
.Field(p => p.Field1)
.Field(p => p.Field2)
.Field(p => p.Field3)
.Field(p => p.Field4)
.Field(p => p.Field5)
.Field(p => p.Field6)
)
.Operator(Operator.And)
.Query(pattern)
) && q
.Range(ra => ra
.Field(ff=>ff.SalePrice)
.GreaterThan(1000)
)
)
);
}
public class SearchItem
{
public int SalePrice { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
public string Field4 { get; set; }
public string Field5 { get; set; }
public string Field6 { get; set; }
}
产生
{
"size": 20,
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "match query",
"operator": "and",
"fields": [
"field1",
"field2",
"field3",
"field4",
"field5",
"field6"
]
}
},
{
"range": {
"salePrice": {
"gt": 1000.0
}
}
}
]
}
}
}
这将发现与multi_match
查询匹配的文档和的salePrice
也大于1000。由于我们不需要为范围查询计算分数(文档的salePrice
大于1000或没有),因此范围查询可以在过滤器上下文中运行。一个稍微改进的版本
client.Search<SearchItem>(x => x
.Sort(so => so
.Descending("_score")
)
.Size(itemsPerPage)
.Query(q => q
.MultiMatch(m => m
.Fields(fs => fs
.Field(p => p.Field1)
.Field(p => p.Field2)
.Field(p => p.Field3)
.Field(p => p.Field4)
.Field(p => p.Field5)
.Field(p => p.Field6)
)
.Operator(Operator.And)
.Query(pattern)
) && +q
.Range(ra => ra
.Field(ff=>ff.SalePrice)
.GreaterThan(1000)
)
)
);
将一元+
运算符附加到范围查询是布尔查询过滤器的简写。查询json现在看起来像
{
"size": 20,
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "match query",
"operator": "and",
"fields": [
"field1",
"field2",
"field3",
"field4",
"field5",
"field6"
]
}
}
],
"filter": [
{
"range": {
"salePrice": {
"gt": 1000.0
}
}
}
]
}
}
}