elasticsearch elasticsearch多字段查询未按预期工作,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch elasticsearch多字段查询未按预期工作,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch elasticsearch多字段查询未按预期工作

elasticsearch elasticsearch多字段查询未按预期工作,elasticsearch,logstash,elasticsearch,Logstash,我在使用多字段elasticsearch查询时遇到了一些问题。我试图查询将名为func_name的字段与两个硬编码字符串相匹配的所有文档,尽管我的索引中有两个函数名的文档,但查询结果总是只获取一个func_名称。到目前为止,我尝试了以下查询 1) 下面只返回一个函数匹配,即使文档还有另一个函数 GET /_search { "query": { "multi_match": { "query": "FEM_DS_GetTunerStatusInfo MDM_TunerSt

我在使用多字段elasticsearch查询时遇到了一些问题。我试图查询将名为func_name的字段与两个硬编码字符串相匹配的所有文档,尽管我的索引中有两个函数名的文档,但查询结果总是只获取一个func_名称。到目前为止,我尝试了以下查询

1) 下面只返回一个函数匹配,即使文档还有另一个函数

GET /_search
{
  "query": {
    "multi_match": {
      "query": "FEM_DS_GetTunerStatusInfo MDM_TunerStatusPrint",
      "operator": "OR",
      "fields": [
        "func_name"
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "should": [
                  { "match": { "func_name": "FEM_DS_GetTunerStatusInfo" }},
                  { "match": { "func_name": "MDM_TunerStatusPrint"   }}
      ]
    }
  }
}
2) 下面间歇性地为我提供了这两个功能

GET /_search
{
    "query": {
        "match": {
            "func_name": {      
                "query":    "MDM_TunerStatusPrint FEM_DS_GetTunerStatusInfo",
                "operator": "or"
            }
        }
    }
}
3) 下面只返回一个函数匹配,即使文档还有另一个函数

GET /_search
{
  "query": {
    "multi_match": {
      "query": "FEM_DS_GetTunerStatusInfo MDM_TunerStatusPrint",
      "operator": "OR",
      "fields": [
        "func_name"
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "should": [
                  { "match": { "func_name": "FEM_DS_GetTunerStatusInfo" }},
                  { "match": { "func_name": "MDM_TunerStatusPrint"   }}
      ]
    }
  }
}
非常感谢您的帮助

谢谢你的回复。假设我的elasticsearch中有以下类型的文档。我希望搜索返回所有文档中的前两个,因为它们与我的函数名匹配

{
    "_index": "diag-178999",
    "_source": {
      "severity": "MIL",
      "t_id": "03468500",
      "p_id": "000007c6",
      "func_name": "MDM_TunerStatusPrint",
      "timestamp": "2017-06-01T02:04:51.000Z"
    }
  },
  {
    "_index": "diag-344563",
    "_source": {
      "t_id": "03468500",
      "p_id": "000007c6",
      "func_name": "FEM_DS_GetTunerStatusInfo",
      "timestamp": "2017-07-20T02:04:51.000Z"
    }
  },
  {
    "_index": "diag-101010",
    "_source": {
      "severity": "MIL",
      "t_id": "03468500",
      "p_id": "000007c6",
      "func_name": "some_func",
      "timestamp": "2017-09-15T02:04:51.000Z"
    }

据我所知,您应该使用筛选查询将任何文档与上面提到的
func_name
的值之一进行匹配:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "func_name": [
                  "FEM_DS_GetTunerStatusInfo",
                  "MDM_TunerStatusPrint"
                ]
              }
            }
          ]
        }
      }
    }
  }
}
见: ,

ES 5.0中的更新:

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "func_name": [
              "FEM_DS_GetTunerStatusInfo",
              "MDM_TunerStatusPrint"
            ]
          }
        }
      ]
    }
  }
}
请参阅:

请求ES的“两个最佳方法”是按特定字段的术语进行筛选或聚合查询,以便您可以重命名字段、应用多个规则并为您的响应提供更易于理解的格式

请参阅:另一个文档页面在这里,非常有用:

在您的情况下,您应该:

{
“从”:0,“大小”:2,
“查询”:{
“过滤器”:{
“布尔”:{
“必须”:{
“期限”:{
“func_name”:“FEM_DS_GetTunerStatusInfo或MDM_TunerStatusPrint”,
}
}
}
}
}
}
或
“aggs”:{
“aggregationName”:{
“条款”:{
“函数名称”:“FEM\U DS\U GetTunerStatusInfo或MDM\U TunerStatusPrint”
}
}
}

}
请您添加更多详细信息,如示例文档和您正在使用的elasticsearch映射?multi_match查询用于查询多个字段,因此可能不是您想要实现的,因为您只针对名为
func_name
…的单个字段。编辑了我的问题以添加详细信息。我还提出了一个关于logstash筛选器以提取不规则数据的问题,请查看您是否可以提供帮助。当使用过滤查询时,我看到错误,“error”:{“root_cause”:[{“type”:“parsing_exception”,“reason”:“no[query]registed for[filtered],“line”:3,“col”:17}}}这并没有获取任何数据,但我已经计算出了查询……下面的方法很好..GET/_search{“query“匹配”:{“func_name”:{“query”:“AEM_InputMonitorThread FEM_PLUGIN_Cable_DeviceEvent common_signal_handler”,“operator”:“或”}}}}}}}}@NinjaSolid如果是,请将其添加为答案:)抱歉,它不起作用,“原因”:“否[query]为[filter]注册”“,对此问题有何评论?抱歉,我没有阅读elastic 5.0文档,我猜您正在使用它?语法已更改,请尝试删除筛选器对象,此主题应修复您的查询:对于日志存储问题,使用grok筛选器和regex也是最好的方法: