我正在尝试将结果分组,以便将它们按类别分组。
SearchResponse response = client.prepareSearch("search")
.addAggregation(AggregationBuilders.terms("category").field("category").size(0))
.execute()
.actionGet();
上面的代码创建了聚合,但是我遇到了一个问题,其中 带有连字符的字符串 被分隔并放入了自己的“ Bucket”中。
从我已阅读的内容中,我需要更改映射设置,以便不分析类别,但是我不确定如何执行此操作。写入Elasticsearch或阅读时完成了吗?究竟如何设置?
步骤1)首先在json文件中为Elasticsearch类型创建映射,
例如。 resources/Customer.json
{
"Customer" : {
"settings" : {
},
"properties" : {
"category" : { "type":"String" , "index" : "not_analyzed"}
}
}
}
}
}
STEP
2)创建一个Java方法以应用json文件中的映射(请参见此处的完整示例)
class EsUtils {
public static Client client
public static void applyMapping(String index, String type, String location) throws Exception {
String source = readJsonDefn(location);
if (source != null) {
PutMappingRequestBuilder pmrb = client.admin().indices()
.preparePutMapping(index)
.setType(type);
pmrb.setSource(source);
MappingListener mappingListener = new MappingListener(pmrb)
// Create type and mapping
Thread thread = new Thread(mappingListener)
thread.start();
while (!mappingListener.processComplete.get()) {
System.out.println("not complete yet. Waiting for 100 ms")
Thread.sleep(100);
}
} else {
System.out.println("mapping error");
}
}
public static String readJsonDefn(String url) throws Exception {
//implement it the way you like
StringBuffer bufferJSON = new StringBuffer();
FileInputStream input = new FileInputStream(new File(url).absolutePath);
DataInputStream inputStream = new DataInputStream(input);
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = br.readLine()) != null) {
bufferJSON.append(line);
}
br.close();
return bufferJSON.toString();
}
}
第3步)通过您的es客户端调用applyMapping()方法,
String index = "search"; //yourIndex
String type = "Customer";
String location = "resources/Customer.json";
EsUtils.client = yourClient; //pass your client
EsUtils.applyMapping(index, type, location);
步骤4)根据需要进行查询 ,
SearchRequestBuilder builder = client.prepareSearch("search");
builder.addAggregation(AggregationBuilders.terms("categoryterms")
.field("category").size(0))
SearchResponse response = builder.execute().actionGet();
Elasticsearch应用映射
问题内容: 假设我有一个映射中指定的字符串字段。如果我随后添加到映射,ElasticSearch会重复存储吗?我对字段的了解是,它们不是通过分析器运行的,索引 为 ,但是客户端可以对其进行匹配。因此,如果一个字段既是和,则可能导致ElasticSearch保留该字符串的两个副本。 我的问题: 如果将字符串字段同时存储为和,是否将重复存储该字符串? 我希望这很清楚。谢谢! 问题答案: 您正在混合使用
问题内容: 是否可以将现有字段的属性从修改为? 如果没有,我该怎么办才能将我所有的文件保存起来? 我无法删除映射(因为所有文档都将消失),并且需要该旧字段进行分析。 问题答案: 不能修改现有字段,但是,您可以创建其他字段或子字段添加到您的领域。 我要使用后一种解决方案。因此,首先,将一个新的子字段添加到您现有的字段中,如下所示: 上面,我们已经添加了子场称为(被分析)现有的(这是) 接下来,我们需
问题内容: 我的映射定义中包含以下字段: 当我索引用的有价票证该值被分成3个术语:,,。 我究竟做错了什么? 我创建了以下索引: 然后我索引以下文档: 然后,我将插件https://github.com/jprante/elasticsearch-index- termlist 与以下API结合使用: 这将给我以下响应: `` 问题答案: 通过运行以下命令验证映射是否已真正设置: 创建索引的命令似
问题内容: 我正在将ES 0.20.6与elasticsearch -river- jdbc插件一起使用 。我使用以下方法创建了一条河: 现在,我要添加的类型映射为插件文档中定义的选项。但我真的无法弄清楚语法,总是会收到以下错误(部分内容因我的尝试而异) 问题答案: 我认为您提交的东西甚至都不是正确的json对象。我可以想象到type_mapping对象必须包含映射,与使用put映射api或创建索
问题内容: 我已经使用cmd删除了映射 在我的conf中,我已将索引定义如下, 并尝试创建一个新的映射,但是我得到了错误 {“错误”:{“ root_cause”:[{“类型”:“ index_not_found_exception”,“原因”:“无此类索引”,“ resource.type”:“ index_or_alias”,“ resource.id”:“ logstash_log ” ,“
这看起来有点吓人。最好的办法是什么?输出真的需要这种复杂类型吗?