多个匹配短语前缀在Elasticsearch中返回零结果

时间:2016-08-30 17:15:12

标签: elasticsearch

我有以下Elasticsearch,版本2.3,查询产生零结果。

{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase_prefix": {
            "phone": "123"
          }
        },
        {
          "match_phrase_prefix": {
            "firstname": "First"
          }
        }
      ]
    }
  }
}

以上查询的输出:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

使用_explain

输出上述查询
{
  "_index": "index_name",
  "_type": "doc_type",
  "_id": "_explain",
  "_version": 4,
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}

然而,当我执行以下任一操作时,我得到的结果包括与上述查询的两个部分匹配的一个文档。如果我包含完整的电话号码,则文档将显示在结果中。

电话号码存储为字符串,没有任何格式。即“1234567890”。

两个前缀查询返回零结果的原因是什么?

{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase_prefix": {
            "phone": "123"
          }
        }
      ]
    }
  }
}

{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase_prefix": {
            "firstname": "First"
          }
        }
      ]
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我可以通过将电话号码查询更改为 regexp 查询而不是 match_phrase_prefix 查询来获得我想要的结果。

{
  "query": {
    "bool": {
      "must": [
        {
          "regexp": {
            "phone": "123[0-9]+"
          }
        },
        {
          "match_phrase_prefix": {
            "firstname": "First"
          }
        }
      ]
    }
  }
}