如何在 kibana 中设置 fielddata=true
how to set fielddata=true in kibana
我是 Kibana 的新手,已将数据加载到 Elastic 5.0.0-alpha3 中,并且正在使用 Kibana 5.0.0-alpha3 进行可视化。我可以将一些数字字段显示为直方图,但是当我想使用文本字段时,我得到:
Visualize: Fielddata is disabled on text fields by default. Set fielddata=true on [publisher] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.
我被警告数据(出版商名称)可能已被分析到子字段中,但我还是想显示。
如何设置fielddata=true
?
编辑:Kibana 最近的问题 github 表明这是 5.0.0 中的新功能,仍在等待答案!
编辑(遵循@Val 的回答,并寻求 Elastic 新手帮助,并希望其他人会发现它有用)。摄取脚本是:
fs = require('fs')
var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({
host: 'localhost:9200',
log: 'trace'
});
fs.readFile('/Users/pm286/workspace/cmdev/getpapers/20160602/crossref_results.json', (err, data) => {
if (err) throw err;
document = JSON.parse(data)
document = JSON.parse(data)
for(i=0;i<document.length;i++) {
client.create({
index: 'index',
type: 'type',
body: document[i]
})
}
});
如何在其中包含@Val 的方法?
在您的 ES 映射中,您需要在 publisher
字段中设置 fielddata:true
:
PUT your_index/_mapping/your_type
{
"your_type": {
"properties": {
"publisher": {
"type": "text",
"fielddata": true
}
}
}
}
您需要在进行此更改后重新索引您的数据,但之后 Kibana 不会再抱怨了。
更新
您可以在 Sense UI 或通过 curl
执行上述查询
curl -XPUT http://localhost:9200/index -d '{
"mappings": {
"type": {
"properties": {
"publisher": {
"type": "text",
"fielddata": true
}
}
}
}
}'
或者您也可以在创建文档之前在 Javascript 文件中执行它:
client.indices.create({
index: 'index',
body: {
"mappings": {
"type": {
"properties": {
"publisher": {
"type": "text",
"fielddata": true
}
}
}
}
}
});
由于您使用的是 Elastic 5.x(我写这篇文章时 5.2 已经发布),您应该改为使用新的关键字支持,而不是在索引字段上启用字段数据。
https://www.elastic.co/guide/en/elasticsearch/reference/5.2/fielddata.html 提供了关于优缺点以及如何设置的很好的信息。
来自页面:
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
然后,您可以使用 'my_field' 字段进行搜索,使用 'my_field.keyword' 字段进行聚合、排序或在脚本中使用。
my_field.keyword 是您将在 Kibana / Grafana 中使用的内容。
此代码解决了这个问题。
PUT megacorp/_mapping/employee
{
"employee": {
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}
}
因此此代码将 运行 此后:
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests"}
}
}
}
在现有文本字段上启用字段数据,这是对该字段进行聚合所必需的
PUT megacorp/_mapping/employee
{
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}
如果您来自 "ElasticsearchThe Definitive Guide" 书,请尝试更改此
"terms" : { "field" : "interests" },
至
"terms" : { "field" : "interests.keyword" },
因此,运行 的代码将变为;
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests.keyword"}
}
}
}
字段“your_type”是什么?
PUT your_index/_mapping/your_type
我是 Kibana 的新手,已将数据加载到 Elastic 5.0.0-alpha3 中,并且正在使用 Kibana 5.0.0-alpha3 进行可视化。我可以将一些数字字段显示为直方图,但是当我想使用文本字段时,我得到:
Visualize: Fielddata is disabled on text fields by default. Set fielddata=true on [publisher] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.
我被警告数据(出版商名称)可能已被分析到子字段中,但我还是想显示。
如何设置fielddata=true
?
编辑:Kibana 最近的问题 github 表明这是 5.0.0 中的新功能,仍在等待答案!
编辑(遵循@Val 的回答,并寻求 Elastic 新手帮助,并希望其他人会发现它有用)。摄取脚本是:
fs = require('fs')
var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({
host: 'localhost:9200',
log: 'trace'
});
fs.readFile('/Users/pm286/workspace/cmdev/getpapers/20160602/crossref_results.json', (err, data) => {
if (err) throw err;
document = JSON.parse(data)
document = JSON.parse(data)
for(i=0;i<document.length;i++) {
client.create({
index: 'index',
type: 'type',
body: document[i]
})
}
});
如何在其中包含@Val 的方法?
在您的 ES 映射中,您需要在 publisher
字段中设置 fielddata:true
:
PUT your_index/_mapping/your_type
{
"your_type": {
"properties": {
"publisher": {
"type": "text",
"fielddata": true
}
}
}
}
您需要在进行此更改后重新索引您的数据,但之后 Kibana 不会再抱怨了。
更新
您可以在 Sense UI 或通过 curl
执行上述查询curl -XPUT http://localhost:9200/index -d '{
"mappings": {
"type": {
"properties": {
"publisher": {
"type": "text",
"fielddata": true
}
}
}
}
}'
或者您也可以在创建文档之前在 Javascript 文件中执行它:
client.indices.create({
index: 'index',
body: {
"mappings": {
"type": {
"properties": {
"publisher": {
"type": "text",
"fielddata": true
}
}
}
}
}
});
由于您使用的是 Elastic 5.x(我写这篇文章时 5.2 已经发布),您应该改为使用新的关键字支持,而不是在索引字段上启用字段数据。
https://www.elastic.co/guide/en/elasticsearch/reference/5.2/fielddata.html 提供了关于优缺点以及如何设置的很好的信息。 来自页面:
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
然后,您可以使用 'my_field' 字段进行搜索,使用 'my_field.keyword' 字段进行聚合、排序或在脚本中使用。
my_field.keyword 是您将在 Kibana / Grafana 中使用的内容。
此代码解决了这个问题。
PUT megacorp/_mapping/employee
{
"employee": {
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}
}
因此此代码将 运行 此后:
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests"}
}
}
}
在现有文本字段上启用字段数据,这是对该字段进行聚合所必需的
PUT megacorp/_mapping/employee
{
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}
如果您来自 "ElasticsearchThe Definitive Guide" 书,请尝试更改此
"terms" : { "field" : "interests" },
至
"terms" : { "field" : "interests.keyword" },
因此,运行 的代码将变为;
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests.keyword"}
}
}
}
字段“your_type”是什么?
PUT your_index/_mapping/your_type