Elasticsearch仅使用" .keyword"附加

时间:2017-09-05 18:59:41

标签: elasticsearch elasticsearch-5

Elasticsearch仅使用" .keyword"所附

我在查询一个充满流畅日志条目的elasticsearch 5实例的时候非常糟糕,我从一个运行版本1.7的旧版弹性搜索实例导入了这些条目。通过Kibana查询最简单的事情经常会超时,而且我总是在黑暗中寻找调查潜在性能问题的地方。索引I查询的弹性搜索映射的样本如下所示:

=> {"@log_name"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "@timestamp"=>{"type"=>"date"},
 "@version"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "action"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "api"=>{"type"=>"boolean"},
 "controller"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "db"=>{"type"=>"float"},
 "duration"=>{"type"=>"float"},
 "error"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "filtered_params"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "user"=>
  {"properties"=>
    {"email"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
     "snowflake_id"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
     "snowflake_uid"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
     "type"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}},
  ...

有了这个,我可以使用curl查询索引,并返回找到的文档总数:

curl -s -XGET 'localhost:9200/logstash-2017.08.15/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "user.email": "user@example.com" 
          }
        }
      ]
    }
  }
}
' | jq ".hits.total | length"

0

意味着找到了0个文件。 但是,如果我将user.email字词替换为user.email.keyword,则查询返回total个数字为40。

我想我的主要问题是:我如何知道这些数据的映射是否正确? (对于导入的数据,它们是在插入时插入数据时创建的,我假设它是向前的,它们是自动创建的)

1 个答案:

答案 0 :(得分:2)

user.email字段的类型为text。索引到此类型的字段时,分析器会将源值拆分并转换为一个或多个术语。每个术语都存储在索引中以允许搜索该术语。映射未指定字段的分析器,因此使用default analyzer。要显示默认分析器输出的术语,请调用

curl -s -XGET http://localhost:9200/logstash-2017.08.15/_analyze -d'{"text": "user@example.com"}' | jq . 

根据您的示例,在user.email字段中搜索术语用户可能会找到结果。

user.email.keyword子字段的类型为keyword。此类型的字段只能按其确切值进行搜索。也就是说,搜索查询中指定的值必须与原始源值完全相同。