弹性搜索 - 搜索查询以匹配特定键的任何一个值

时间:2017-11-03 22:26:19

标签: elasticsearch elasticsearch-5

我是ES查询的新手。我试图根据一个可以匹配任何值而不是一个特定值的键来获得结果。例如:键foo可以是bar, baz中的一个。我尝试使用数组,但最终会得到错误的结果或异常。 ES中OR案例的正确语法是什么。我使用的是ES 5.6。*

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。

根据您使用的分析仪,您可以这样做:

GET /test/_search
{
  "query": {
    "match": {
      "foo": "bar, baz"
    }
  }
}

演示它分析的内容(默认情况下为5.6)

GET /test/_analyze
{
  "field": "foo",
  "text": [
    "bar, baz"
  ]
}

输出这些代币:

{
  "tokens": [
    {
      "token": "bar",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "baz",
      "start_offset": 5,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

在上面的例子中,使用“bar,baz”或“bar baz”相当于搜索“bar”和“baz”。

你也可以在这样的查询中对它们进行分组:

GET /test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "foo": "bar"
          }
        },
        {
          "match": {
            "foo": "baz"
          }
        }
      ]
    }
  }
}

上面会给你一个得分的查询,要求查询文件中的bar和baz匹配。

您也可以将“must”替换为“filter”,“should”或“must_not”。 “过滤器”将被取消标记,应该将您从ANDing查询切换到ORing查询(并且您还可以指定OR的最小量),或者使用“must_not”

反转查询

Bool query

除此之外还有更多方法,但这应该让你开始走上正轨。

一个“应该”的例子,只需要命中两个术语中的一个,因为这是你原来的问题:

GET /test/_search
{
  "query": {
    "bool": {
      "minimum_should_match": 1, 
      "should": [
        {
          "match": {
            "foo": "bar"
          }
        },
        {
          "match": {
            "foo": "baz"
          }
        }
      ]
    }
  }
}

答案 1 :(得分:0)

您需要将bool条件与shouldmatchmatch_phrase结合使用(只要您确切知道要搜索的内容,就会喜欢match_phrase)

GET local-signaler/_search
{
  "query": {
    "bool" : {
      "should" : [
        { "match_phrase" : { "foo" : "bar" } },
        { "match_phrase" : { "foo" : "baz" } }
      ],
      "minimum_should_match" : 1
    }
  }
}