J'ai construit une application en C# qui recherche mes documents Elasticsearch et tout fonctionne bien en utilisant ce code.....
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();
Tout cela fonctionne bien, mais il y a un nouveau besoin de rechercher le champ audit_Event par rapport à plusieurs phrases, telles que "User Login", "Add Employee", etc.
J'ai trouvé des références à multi_match mais cela semble être plus lié à la recherche sur plusieurs champs plutôt que sur plusieurs valeurs dans un seul champ.
En suivant les discussions ci-dessous, TermQuery semble faire le travail mais ne renvoie aucune valeur. Avez-vous une idée ?
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();
J'ai également vérifié les deux requêtes à l'aide de Kibana, la première renvoie des données mais pas la seconde, et je me demande maintenant s'il ne s'agit pas d'un problème avec la façon dont les données sont indexées.....
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"]
}
}
}