java - Elasticsearch 映射设置 'not_analyzed' 和 Java 中按字段分组

标签 java elasticsearch

我正在尝试对结果进行分组,以便它们按类别分组。

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();

完整引用

Elasticsearch apply mapping

关于java - Elasticsearch 映射设置 'not_analyzed' 和 Java 中按字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25620471/

相关文章:

java - 将 stringWidth 与 html 字符串一起使用

java - 从子上下文引用在父上下文中创建的 Spring Singletons

elasticsearch - Elasticsearch查询聚合过滤器需要的范围建议

elasticsearch:无法使用 XContentBuilder 设置 geo_shape 值

elasticsearch - 奇数主节点

elasticsearch - Kibana仪表板显示了空的可视化,但可视化本身有效

elasticsearch - 对 Elasticsearch 类型的所有字段使用 Completion Suggester

java - 从 String.split 创建数组时出现 NullPointerException

java - 在frame中嵌套Panel实现动画

java - 从 Java 代码获取 rabbitmq 队列中的消息计数