【发布时间】:2020-11-19 16:02:42
【问题描述】:
我已经用 C# 构建了一个应用程序,它可以搜索我的 Elasticsearch 文档,并且使用此代码一切正常......
List<AuditLog> resultsList = Client.SearchAsync<AuditLog>(s => s
.From(0)
.Take(noRows)
.Query(q => q
.Bool(b => b
.Must(mu => mu.MatchPhrase(mp => mp.Field("audit_Event").Query(auditEvents)),
mu => mu.Match(ma => ma.Field(field).Query(value))
)
)
)).Result.Documents.ToList();
这一切都很好,但有一个新要求是针对多个短语搜索 audit_Event 字段,例如“用户登录”、“添加员工”等
我找到了对 multi_match 的引用,但这似乎与跨多个字段而不是在一个字段中搜索多个值更相关。
根据下面的讨论,TermQuery 似乎可以完成这项工作,但不会返回任何值。有什么想法吗?
QueryContainer queryAnd = new TermQuery() { Field = "audit_Application", Value = "MyApplication" };
QueryContainer queryOr = new TermQuery() { Field = "audit_Event", Value = "Employee Inserted" };
queryOr |= new TermQuery() { Field = "audit_Event", Value = "Employee Updated" };
QueryContainer queryMain = queryAnd & queryOr;
resultsList = Client.SearchAsync<AuditLog>(s => s
.From(0)
.Take(noRows)
.Query(q => q
.Bool(b => b
.Must(queryMain)
)
)).Result.Documents.ToList();
我还使用 Kibana 检查了两个查询,第一个返回数据,但第二个没有,现在想知道数据的索引方式是否有问题....
GET auditlog/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"audit_Event": "Employee Updated"
}
},
{
"match_phrase": {
"audit_Event": "Employee Inserted"
}
}
]
}
}
}
GET auditlog/_search
{
"query" : {
"terms": {
"audit_Event": ["Employee Updated","Employee Inserted"]
}
}
}
【问题讨论】:
-
你需要这样的东西吗? stackoverflow.com/a/63972341/1068246
-
查看了这一点,这将起作用,因为它允许我根据用户选择的内容以编程方式构建查询,但不幸的是它不返回任何值。相应地修改了主要问题
标签: c# elasticsearch nest