ElasticSearch无法在值包含撇号的关键字字段上返回结果

时间:2018-12-19 02:56:10

标签: elasticsearch elasticsearch-5

我正在处理的应用程序允许在标签中使用任何字符。标签以数组形式存储在文档中。其他字符似乎工作正常,但撇号无效。在早期版本的ES中,我们将该字段映射为一个分析字符串,但是当前版本不允许我们使用一些正在使用的聚合,因此我将其更改为关键字,此问题浮出水面。当我查询带有指定标签的文档时,即使我知道该字段的查询是正确的,也没有任何结果(相同的查询返回除包含撇号的标签以外的所有其他标签的结果)。设置如下:

字段映射:

{ 
    "tags" : {
       "type" : "keyword",
       "store" : true
    }
}

字段数据:

"tags" : [
    "Mike's Tag"
  ]

查询

{
  "query": {
    "bool": {
      "should": [
        {
          "query_string": {
            "query": "tags:\"Mike's Test\"",
            "default_operator": "AND"
          }
        }
      ]
    }
  }
}

1 个答案:

答案 0 :(得分:1)

如果您不想在标签上评分,可以使用term查询来获得所需的结果。

使用以下查询:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "tags": "Mike's Tag"
          }
        }
      ]
    }
  }
}

评论后更新

如果您想通过query_string进行此操作,则查询如下:

{
  "query": {
    "query_string": {
      "query": "Mike's Tag",
      "fields": [
        "tags"
      ]
    }
  }
}

注意:如果您不希望得分,我仍然建议您在过滤器上下文中使用termterms查询。

上述查询的输出(使用term查询)

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0,
    "hits": [
      {
        "_index": "test",
        "_type": "_doc",
        "_id": "1",
        "_score": 0,
        "_source": {
          "tags": [
            "Mike's Tag",
            "Another Tag"
          ]
        }
      },
      {
        "_index": "test",
        "_type": "_doc",
        "_id": "2",
        "_score": 0,
        "_source": {
          "tags": [
            "Mike's Tag",
            "Another one Tag"
          ]
        }
      }
    ]
  }
}