Elasticsearch:在数组中查找完全匹配

时间:2019-01-22 19:40:39

标签: elasticsearch

我有以下文件:

{
    ...
    _source: {
        id: 1, 
        tags: [
            "xxx"
        ]
    }
},
{
     ...
     _source: {
         id: 2, 
         tags: [
             "xxx yyy"
         ]
     }
}

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

我尝试过:

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

但是它与两个文档一起返回。

1 个答案:

答案 0 :(得分:2)

您的基本问题是,您尚未定义显式映射,因此默认映射将起作用。假设您正在使用最新版本5或6。

在标签字段中搜索的内容是经过分析的文本,因此它将为xxx yyy创建令牌xxxyyy,它们也与您的搜索匹配。

GET _analyze
{
  "text": "xxx yyy"
}

您可以查询多字段tags.keyword,该字段将为您提供完全匹配的内容(不分析字段值)。例如:

GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "tags.keyword": "xxx"
        }
      }
    }
  }
}

或者另一种可能性,并且从一开始就直接使用关键字类型。 tags通常属于keyword类型,或者未经分析。

定义映射

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"
  ]
}

使用上面的映射,您可以搜索tags