Elasticsearch:使用 Java 添加手动映射

2024-03-27

我无法更改映射。有人能帮我找到代码中的错误吗?
我根据几个教程找到了更改映射的标准方法。但是,当我尝试调用映射结构时,在手动创建映射后只会出现一个空白映射结构。
但是插入一些数据后就会出现映射规范,因为ES当然使用默认的映射规范。更具体的请看下面的代码。

public class ElasticTest {
private String dbname = "ElasticSearch";
private String index = "indextest";
private String type = "table";
private Client client = null;
private Node node = null;

public ElasticTest(){
    this.node = nodeBuilder().local(true).node();
    this.client = node.client();

    if(isIndexExist(index)){
        deleteIndex(this.client, index);
        createIndex(index);
    }
    else{
        createIndex(index);
    }

    System.out.println("mapping structure before data insertion");
    getMappings();
    System.out.println("----------------------------------------");
    createData();
    System.out.println("mapping structure after data insertion");
    getMappings();



}

public void getMappings() {
    ClusterState clusterState = client.admin().cluster().prepareState()
            .setFilterIndices(index).execute().actionGet().getState();
    IndexMetaData inMetaData = clusterState.getMetaData().index(index);
    MappingMetaData metad = inMetaData.mapping(type);

    if (metad != null) {
        try {
            String structure = metad.getSourceAsMap().toString();
            System.out.println(structure);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

private void createIndex(String index) {
    XContentBuilder typemapping = buildJsonMappings();
    String mappingstring = null;
    try {
        mappingstring = buildJsonMappings().string();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    client.admin().indices().create(new CreateIndexRequest(index)
                  .mapping(type, typemapping)).actionGet();

    //try put mapping after index creation
    /*
     * PutMappingResponse response = null; try { response =
     * client.admin().indices() .preparePutMapping(index) .setType(type)
     * .setSource(typemapping.string()) .execute().actionGet(); } catch
     * (ElasticSearchException e) { e.printStackTrace(); } catch
     * (IOException e) { e.printStackTrace(); }
     */

}

private void deleteIndex(Client client, String index) {
    try {
        DeleteIndexResponse delete = client.admin().indices()
                .delete(new DeleteIndexRequest(index)).actionGet();
        if (!delete.isAcknowledged()) {
        } else {
        }
    } catch (Exception e) {
    }
}

private XContentBuilder buildJsonMappings(){
    XContentBuilder builder = null; 
    try {
        builder = XContentFactory.jsonBuilder();
        builder.startObject()
        .startObject("properties")
            .startObject("ATTR1")
                .field("type", "string")
                .field("store", "yes")
                .field("index", "analyzed")
             .endObject()
           .endObject()
        .endObject();           
    } catch (IOException e) {
        e.printStackTrace();
    }
    return builder;
}

private boolean isIndexExist(String index) {
    ActionFuture<IndicesExistsResponse> exists = client.admin().indices()
            .exists(new IndicesExistsRequest(index));
    IndicesExistsResponse actionGet = exists.actionGet();

    return actionGet.isExists();
}

private void createData(){
    System.out.println("Data creation");
    IndexResponse response=null;
    for (int i=0;i<10;i++){
        Map<String, Object> json = new HashMap<String, Object>();
        json.put("ATTR1", "new value" + i);
        response = this.client.prepareIndex(index, type)
                .setSource(json)
                .setOperationThreaded(false)
                .execute()
                .actionGet();
    }
    String _index = response.getIndex();
    String _type = response.getType();
    long _version = response.getVersion();
    System.out.println("Index : "+_index+"   Type : "+_type+"   Version : "+_version);
    System.out.println("----------------------------------");
}

public static void main(String[] args)
{
    new ElasticTest();
}
}

我只是想更改 ATTR1 字段的属性进行分析以确保快速查询。 我做错了什么?我还尝试在创建索引后创建映射,但它会导致相同的影响。


好吧,我自己找到了答案。在类型级别,我必须用类型名称包装“属性”。例如:

“类型1”:{ “特性” : { …… } }

请看下面的代码:

private XContentBuilder getMappingsByJson(){
    XContentBuilder builder = null;
    try {
        builder = XContentFactory.jsonBuilder().startObject().startObject(type).startObject("properties");
        for(int i = 1; i<5; i++){
            builder.startObject("ATTR" + i)
                    .field("type", "integer")
                    .field("store", "yes")
                    .field("index", "analyzed")
                    .endObject();
            }
            builder.endObject().endObject().endObject();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    return builder;
}

它为属性 ATTR1 - ATTR4 创建映射。现在可以动态地为示例定义不同属性列表的映射。希望它对其他人有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch:使用 Java 添加手动映射 的相关文章

  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • SonarQube 进程已退出,退出值 [es]:137

    我想在我的 vps linux x86 64 debian 9 上安装声纳 但是当我执行这个 cdm sonar sh 控制台时 我有以下日志 Running SonarQube wrapper gt Wrapper Started as
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef

随机推荐