c# - 使用 NEST 库查询 ElasticSearch 服务器时如何应用多个条件?
问题描述
我有一个ElasticSearch服务器,我想使用C# NEST library进行查询。
这是我要生成的命令
GET /records/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"available": true
}
},
{
"match": {
"out_scope": false
}
}
]
}
}
}
这是我所做的,我似乎找不到指定字段名称和要搜索的值的正确方法。
var products = await client.SearchAsync<Product>(x =>
x.Query(q =>
q.Bool(b =>
b.Should(bs1 =>
bs1.Match(bsm =>
bsm.Field(fff => fff.IsAvailable)
.Term(isAvailable.Value) // This does not work!
),
bs2 =>
bs2.Match(bsm =>
bsm.Field(fff => fff.IsAvailable)
.Term(isAvailable.Value) // This does not work!
)
)
);
如何正确指定字段的名称和要匹配的值?
解决方案
假设一个模型像
public class Product
{
[Keyword(Name = "available")]
public bool? IsAvailable { get; set; }
[Keyword(Name = "out_scope")]
public bool? OutScope { get; set; }
}
那么它将是
var searchResponse = await client.SearchAsync<Product>(x => x
.Query(q =>
q.Bool(b =>
b.Should(bs1 =>
bs1.Match(bsm =>
bsm.Field(fff => fff.IsAvailable)
.Query(isAvailable.Value ? "true" : "false")
),
bs2 =>
bs2.Match(bsm =>
bsm.Field(fff => fff.OutScope)
.Query(isAvailable.Value ? "true" : "false")
)
)
)
)
);
需要考虑的一些事项:
- 匹配查询的查询输入是
.Query
字段/方法。所示的 JSON DSL 示例使用简写形式来表达查询;NEST 总是生成长格式。 - 匹配查询的查询输入最终被强制转换为 Elasticsearch 中的字符串。客户端将其公开为字符串参数。
- 术语查询看起来可能是用于此示例的更好查询;术语查询不会像匹配查询那样进行分析。诸如术语查询之类的术语级查询适用于结构化搜索。
- NEST 在查询上重载运算符,以使编写 bool 查询更加简洁。上式也可以写成
var searchResponse = client.Search<Product>(x => x
.Query(q => q
.Match(bsm => bsm
.Field(fff => fff.IsAvailable)
.Query(isAvailable.Value ? "true" : "false")
) || q
.Match(bsm => bsm
.Field(fff => fff.OutScope)
.Query(isAvailable.Value ? "true" : "false")
)
)
);
推荐阅读
- firebase - 将用户自定义域连接到 Firebase 应用
- c# - 如何在 EF Core 中对导航属性执行子查询?
- javascript - 'Readonly<{ IGoogleMapTrackerProps }> & Readonly<{ chirldren?: ReactNode; 类型上不存在属性 'google' }>'
- python - 使用 Python 需要搜索一个字符串
- visual-studio-code - 在片段“字符串”中创建一个停止
- kotlin - 为什么 BiPredicate.test 方法在 Kotlin 中不可见?
- django - 如何在共享模式和租户模式中正确拥有 contrib.auth
- python - 动态增加 asyncio.Queue 的大小?
- javascript - 如何使用 Axios 选择 React JS 表单输入字段值
- c# - RabbitMQ 连接在本地主机上工作,但不是通过网络