elasticsearch 带And和Or条件的Elasticsearch查询
我有如下的弹性数据elasticsearch 带And和Or条件的Elasticsearch查询,elasticsearch,kibana,querydsl,elasticsearch,Kibana,Querydsl,我有如下的弹性数据 { "_index": "prod", "_type": "log", "_id": "aa", "_source": { "input_type": "log", "sourcetype": "sourcetypeapp1", "message": "APP COMPANY|80d596f6-2082-4a1d-bcfc-740478f626ec|001 ErrorMessage: Some error" "type": "l
{
"_index": "prod",
"_type": "log",
"_id": "aa",
"_source": {
"input_type": "log",
"sourcetype": "sourcetypeapp1",
"message": "APP COMPANY|80d596f6-2082-4a1d-bcfc-740478f626ec|001 ErrorMessage: Some error"
"type": "log",
"tags": [
"beats_input_codec_plain_applied"
]
}
}
我想搜索消息中包含以下数据的所有消息:-
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" AND Message:"ErrorMessage")
Or
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" AND Message:"ErrorMessage")
Or
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" AND Message:"ErrorMessage")
我不太了解elasticsearch查询
我尝试了以下简单查询,但它不起作用(只有一个条件):
你能试试这样的东西吗
{
"query": {
"match": {
"Message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001"
}
}
}
如果这是你想要实现的,试试这个
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } },
{ "match": { "message": "ErrorMessage"}}
]
}
},
{
"bool": {
"must": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } },
{ "match": { "message": "ErrorMessage"}}
]
}
},
{
"bool": {
"must": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } },
{ "match": { "message": "ErrorMessage"}}
]
}
}
]
}
}
}
但在您的示例中,条件12和条件22是相同的。在这种情况下,您可以将其重写为
{
"query": {
"bool": {
"must": [
{ "match": { "message": "ErrorMessage"}},
{
"bool": {
"should": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } },
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } },
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } }
]
}
}
]
}
}
}
如何添加多个and或条件?您可以在bool查询中使用should(or)和must(and)i已尝试此查询,我没有得到正确的结果,好像任何消息包含-2082-然后都会显示出来。但我希望整个短语在整个文本中匹配,“公司| 80d596f6-2082-4a1d-bcfc-740478f626eA | 001。看起来由于连字符我尝试了这个查询,我没有得到正确的结果,好像任何包含4a1d的消息都显示出来了。但是我希望这整个短语在整个文本中匹配,“COMPANY | 80d596f6-2082-4a1d-bcfc-740478f626eA | 001”我以为您想知道如何使用multi或condition of AND conditions。如果要匹配整个文本,应使用通配符not match。Match分析您提供的文本,然后构造查询。但这取决于您如何定义模式。如果消息属性/字段未定义为index:not_analysis(参考),则无法使用通配符解决此问题。因为您的文本将被标记并保存为多个字符串,而不是一个完整的字符串。在这种情况下,您不能匹配完整的文本,因为它不在那里。您必须在一个must中编写每个部分(例如:COMPANY、80d596f6、2082等)的多个匹配查询,因为您希望它检索包含所有部分的行;I don’我不明白,你们能不能提供一个例子?在我看来,连字符是造成问题的原因,它充当了通配符。我不知道如何避免这种情况
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } },
{ "match": { "message": "ErrorMessage"}}
]
}
},
{
"bool": {
"must": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } },
{ "match": { "message": "ErrorMessage"}}
]
}
},
{
"bool": {
"must": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } },
{ "match": { "message": "ErrorMessage"}}
]
}
}
]
}
}
}
{
"query": {
"bool": {
"must": [
{ "match": { "message": "ErrorMessage"}},
{
"bool": {
"should": [
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } },
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } },
{ "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } }
]
}
}
]
}
}
}