是否可以在Elasticsearch中使用doc_values = true过滤非索引字段

时间:2017-10-27 21:47:04

标签: elasticsearch search lucene information-retrieval elasticsearch-5

在Elasticsearch 5.6中使用以下映射:

"category" => [
    "type"=>"keyword",
    "doc_values"=>true,
    "index"=>false
    "store"=>true
]

我得到的建议是,由于其doc_values设置,可以编写一个过滤此字段的查询,即使index属性设置为false,但似乎doc_values字段仅对聚合和排序有用。

是否可以创建一个过滤此字段的查询?

2 个答案:

答案 0 :(得分:2)

未编入索引的字段为by definition,无法搜索。 Elasticsearch不会将它放在倒排索引(用于搜索)中。如果您尝试运行搜索查询,则会收到类似Cannot search on field [category] since it is not indexed.

的错误消息

答案 1 :(得分:-1)

Keyword数据类型默认启用doc_values。您不需要明确启用它。如果搜索到确切的文本,则可以在查询中过滤关键字字段。 例如,我有跟随索引的映射

PUT index_name
{
  "mappings": {
    "type_name": {
      "properties": {
        "id": {
          "type": "long"
        },
        "name": {
          "type": "keyword"
        }
      }
    }
  }
}

示例文件:

{
    "id":1,
    "name":"hatim"
}

所以,我可以通过在查询部分

中过滤它来进行搜索
GET index_name/type_name/_search
{
  "query": {
    "term": {
      "name": "hatim"
    }
  }
}

依此类推,您可以像这样添加聚合

GET index_name/type_name/_search
{
  "query": {
    "term": {
      "name": "hatim"
    }
  },
  "aggs": {
    "count": {
      "value_count": {
        "field": "name"
      }
    }
  }
}