【问题标题】:ElasticSearch multiple string to search with wildcard queryElasticSearch 多个字符串以使用通配符查询进行搜索
【发布时间】:2017-01-30 19:36:17
【问题描述】:

我正在尝试在 Kibana 的 elasticsearch 查询中匹配多个通配符查询。我不太明白。

基本上我想要任何具有属性 type="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","re​​ason":"Can't get text on a START_ARRAY at 1:454"}] ,"type":"search_phase_execution_exception","re​​ason":"所有分片 有什么想法吗?

【问题讨论】:

  • 那么,什么不起作用?
  • 你试过那个查询吗?你在你的应用上测试过吗?
  • 你用的是什么版本?

标签: elasticsearch


【解决方案1】:

尝试将它们放在单独的子句中。

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

【讨论】:

    【解决方案2】:

    我的猜测是你不能为像["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 中有关正则表达式查询的更多信息

    另一种选择是将查询词与查询字符串中的逻辑运算符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查看更多信息

    【讨论】:

    • 我收到“重复键”警告,然后当我保存过滤器时,Kibana 会丢弃第一个“通配符”子句
    • @Dom 我刚刚更新了布尔查询的答案,你试过这种方式吗?
    • @Dom 你仍然可以使用简单的查询和更复杂的正则表达式作为查询字符串
    • 谢谢它的工作。不是最优的,因为我需要在我的 REGEX 中输入 20 个要排除的字符串,但至少它可以工作。
    • 感谢获得第二个解决方案在维护和可读性方面要好得多
    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多