Elasticsearch:在数组中查找精确匹配

3
我有以下文件:
{
    ...
    _source: {
        id: 1, 
        tags: [
            "xxx"
        ]
    }
},
{
     ...
     _source: {
         id: 2, 
         tags: [
             "xxx yyy"
         ]
     }
}

如果我只想检索第一个文档,该如何搜索"xxx"

我尝试了以下方法:

"query" : {
    "filter" : {
        "term" : { 
           "tags" : "xxx"
        }
    }
}

但是它返回了两个文档。
1个回答

2
你的基本问题在于,你没有定义明确的映射,因此默认映射将发挥作用。假设你正在使用最新版本5或6。
在标签字段中搜索是分析文本,因此它会为xxx yyy创建标记xxxyyy,这也符合你的搜索。最初的回答。
GET _analyze
{
  "text": "xxx yyy"
}

你可以查询多字段 tags.keyword ,它将给你一个精确匹配(字段值没有被分析)。例如:
GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "tags.keyword": "xxx"
        }
      }
    }
  }
}

另一种可能性是,从一开始就正确使用关键字类型。通常情况下,标签的类型倾向于是关键字或未经分析的。
定义映射。
PUT test
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "doc": {
      "properties": {
        "tags": {
          "type": "keyword"
        }
      }
    }
  }
}

PUT test/doc/1
{
  "tags": [
    "xxx"
  ]
}
PUT test/doc/2
{
  "tags": [
    "xxx yyy"
  ]
}

使用上述映射,您可以搜索标签。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接