Elasticsearch match_phrase用于多个字段

时间:2018-04-15 09:56:44

标签: elasticsearch match match-phrase

我是Elasticsaerch的新手,我现在正在努力奋斗。我正在尝试搜索所有数据,这些数据在字段eset中具有完全相同的短语。我的查询看起来像这样,它可以工作:

{
   "query" : {
      "match_phrase" : {
         "eset": "Win32/Kryptik.DLT"
      }
   }
}

现在,我还需要多个字段才能获得准确的值,例如在eset和registries字段中,理论上它应该是这样的:

{
   "query" : {
      "match_phrase" : {
         "eset": "Win32/Kryptik.DLT"
      },
      "match_phrase" : {
         "registries": 3
      }
   }
}

但显然,你不能在Elasticsearch中这样做。匹配似乎不适用于多个字段。有什么方法可以做到这一点吗?我需要保留大小写。确切的价值观。术语似乎不起作用,因为大小写以及我的数据中使用的SLASHES。

我尝试了所有我发现的东西,但没有任何效果。如果重要的话,我在版本5.6.6上使用Python API版本6.1.1和Elasticsearch。

2 个答案:

答案 0 :(得分:0)

我想我自己想出来了,解决方法就是:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "eset":  { "query": "Win32/Kryptik.DLT", "type": "phrase" }}},
        { "match": { "registries":  { "query": 3, "type": "phrase" }}}
      ]
    }
  }
}

但我仍然对其他解决方案持开放态度,特别是在SLASHES方面。

答案 1 :(得分:0)

如果您需要输入字符串的精确匹配,请使用match_phrasematch_phrase 按照给定的顺序从输入搜索字符串中搜索单词,它们之间没有任何单词。match 对输入字符串中的单词进行模糊匹配。 参考:https://discuss.elastic.co/t/searching-fields-for-specific-values/64004/2

{
  "query": {
    "bool": {
      "must": [
        { "match_phrase": { "eset":  { "query": "Win32/Kryptik.DLT", "type": "phrase" }}},
        { "match_phrase": { "registries":  { "query": 3, "type": "phrase" }}}
      ]
    }
  }
}

或者,如果您要搜索精确值,也可以使用 term。但是,如果要搜索的精确值未知,请避免使用 term。 来源:参考本页小节 (3) 的 4avoid-term-query-text-fields 点:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html#avoid-term-query-text-fields