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。
我想我的主要问题是:我如何知道这些数据的映射是否正确? (对于导入的数据,它们是在插入时插入数据时创建的,我假设它是向前的,它们是自动创建的)
答案 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
。此类型的字段只能按其确切值进行搜索。也就是说,搜索查询中指定的值必须与原始源值完全相同。