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

时间:2017-09-24 04:45:31

标签: elasticsearch logstash

我一直面临着多字段弹性搜索查询的一些问题。我正在尝试查询与名为func_name的字段匹配的所有文档到两个硬编码字符串,即使我的索引包含具有这两个函数名称的文档,但查询结果始终只获取一个func_name。到目前为止,我已尝试过以下查询。

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

GET /_search
{
  "query": {
    "multi_match": {
      "query": "FEM_DS_GetTunerStatusInfo MDM_TunerStatusPrint",
      "operator": "OR",
      "fields": [
        "func_name"
      ]
    }
  }
}

2)下面断断续续地给我这两个功能。

GET /_search
{
    "query": {
        "match": {
            "func_name": {      
                "query":    "MDM_TunerStatusPrint FEM_DS_GetTunerStatusInfo",
                "operator": "or"
            }
        }
    }
}

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

{
  "query": {
    "bool": {
      "should": [
                  { "match": { "func_name": "FEM_DS_GetTunerStatusInfo" }},
                  { "match": { "func_name": "MDM_TunerStatusPrint"   }}
      ]
    }
  }
}

非常感谢任何帮助。

感谢您的回复。让我们假设我的弹性搜索中有以下类型的文档。我希望我的搜索能够返回前两个文件,因为它们匹配我的func_name。

{
    "_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"
    }

2 个答案:

答案 0 :(得分:1)

请求您的ES的“两种最佳方式”是按特定字段的字词进行过滤或汇总您的查询,以便您可以重命名字段,应用多个规则,并为您的回复提供更易理解的格式

请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html,其他文档页面在这里,非常有用: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html

在你的情况下,你应该这样做:

    {
      "from" : 0, "size" : 2,
      "query": {
          "filter": {
            "bool": {
              "must": {
                "term": {
                  "func_name" : "FEM_DS_GetTunerStatusInfo OR MDM_TunerStatusPrint",
                }
              }
            }
          }
    }
}

OR 
    	"aggs": {
               "aggregationName": {
                     "terms": {
    		     "func_name" : "FEM_DS_GetTunerStatusInfo OR MDM_TunerStatusPrint"
    		   }
              }
            }
        }

最后的聚合只是为了向您展示如何与查询过滤器做同样的事情。让我知道它是否正常工作:)

祝你好运

答案 1 :(得分:0)

据我了解,您应该使用过滤后的查询来匹配任何上面提到的func_name值之一的文档:

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

请参阅: Filtered QueryTemrs Query

ES 5.0中的更新:

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

请参阅:this answer