我正在尝试对结果进行分组,以便它们按类别分组。
SearchResponse response = client.prepareSearch("search")
.addAggregation(AggregationBuilders.terms("category").field("category").size(0))
.execute()
.actionGet();
上面的代码创建了聚合,但我遇到了一个问题,其中带有连字符的字符串被分开并放入自己的“存储桶”中。
根据我所读到的内容,我需要更改映射设置,以便不分析类别,但我不确定如何执行此操作。这是在写入 Elasticsearch 时还是在读取时完成的?具体是怎么设置的?
最佳答案
要使用java api应用elasticsearch映射,
步骤 1) 首先在 json 文件中创建 Elasticsearch 类型的映射,
例如。resources/Customer.json
{
"Customer" : {
"settings" : {
},
"properties" : {
"category" : { "type":"String" , "index" : "not_analyzed"}
}
}
}
}
}
第 2 步)创建一个 java 方法来应用来自 json 文件的映射(请参阅完整示例 here )
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步)调用applyMapping()方法传递你的es客户端,
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();
完整引用
关于java - Elasticsearch 映射设置 'not_analyzed' 和 Java 中按字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25620471/