ElasticSearch使用通配符查询搜索多个字符串

时间:2017-01-30 19:36:18

标签: elasticsearch

我正在尝试在Kibana中的弹性搜索查询中进行多个通配符查询匹配。我无法弄明白。

基本上我想要任何属性类型=“erreur”

的文档

我想在字段descr_courte

上排除与字符串“An established *”或“java.lang。*”匹配的所有文档
{
  "query": {
    "bool": {
      "must": {
        "term": {
          "type": "erreur"
        }
  },
      "must_not": {
        "wildcard": {
          "descr_courte": ["An established*", "java.lang.*"]
        }
      }
    }
  }
}

如果我放一个通配符查询就可以了。

{
 "query": {
    "bool": {
      "must": {
        "term": {
          "type": "erreur"
        }
      },
      "must_not": {
        "wildcard": {
          "descr_courte": 
            "An established*"
        }
      }
    }
  }
}   

我得到的错误:

错误:对Elasticsearch的请求失败:{“error”:{“root_cause”:[{“type”:“illegal_state_exception”,“reason”:“无法在1:454的START_ARRAY上获取文字”}] ,“type”:“search_phase_execution_exception”,“reason”:“所有分片 有什么想法吗?

2 个答案:

答案 0 :(得分:3)

尝试将它们作为单独的条款。

{
  "query": {
    "bool": {
      "must": {
        "term": {
          "type": "erreur"
        },
        "must_not": [
          {
            "wildcard": {
              "descr_courte": "An established*"
            }
          },
          {
            "wildcard": {
              "descr_courte": "java.lang.*"
            }
          }
        ]
      }
    }
  }
}

答案 1 :(得分:1)

我的猜测是你不能为像["An established*", "java.lang.*"]这样的通配符查询创建一个数组,所以你需要:

{
 "query": {
    "{
      "must": {
        "term": {
          "type": "erreur"
        }
      },
      "must_not": {
        "regexp": {
          "descr_courte": "(An established|java\.lang\.).*"
        }
      }
    }
  }
}

有关https://www.elastic.co/guide/en/elasticsearch/reference/5.1/query-dsl-regexp-query.html

中的regexp查询的详细信息

另一种选择是将查询字词与查询字符串中的逻辑运算符NOTANDOR结合使用

{
 "query": {
    "query_string" : {
        "query" : "type:erreur AND NOT(descr_courte:An established* OR descr_courte:java.lang.*)"
    }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_wildcards

查看更多信息