我正在处理的应用程序允许在标签中使用任何字符。标签以数组形式存储在文档中。其他字符似乎工作正常,但撇号无效。在早期版本的ES中,我们将该字段映射为一个分析字符串,但是当前版本不允许我们使用一些正在使用的聚合,因此我将其更改为关键字,此问题浮出水面。当我查询带有指定标签的文档时,即使我知道该字段的查询是正确的,也没有任何结果(相同的查询返回除包含撇号的标签以外的所有其他标签的结果)。设置如下:
字段映射:
{
"tags" : {
"type" : "keyword",
"store" : true
}
}
字段数据:
"tags" : [
"Mike's Tag"
]
查询
{
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "tags:\"Mike's Test\"",
"default_operator": "AND"
}
}
]
}
}
}
答案 0 :(得分:1)
如果您不想在标签上评分,可以使用term
查询来获得所需的结果。
使用以下查询:
{
"query": {
"bool": {
"filter": [
{
"term": {
"tags": "Mike's Tag"
}
}
]
}
}
}
评论后更新:
如果您想通过query_string
进行此操作,则查询如下:
{
"query": {
"query_string": {
"query": "Mike's Tag",
"fields": [
"tags"
]
}
}
}
注意:如果您不希望得分,我仍然建议您在过滤器上下文中使用term
或terms
查询。
上述查询的输出(使用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"
]
}
}
]
}
}