当前位置: 首页 > 面试题库 >

Elasticsearch映射设置'not_analyzed'并按Java中的字段分组

索和璧
2023-03-14
问题内容

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

SearchResponse response = client.prepareSearch("search")
                .addAggregation(AggregationBuilders.terms("category").field("category").size(0))
                .execute()
                .actionGet();

上面的代码创建了聚合,但是我遇到了一个问题,其中 带有连字符的字符串 被分隔并放入了自己的“ Bucket”中。

从我已阅读的内容中,我需要更改映射设置,以便不分析类别,但是我不确定如何执行此操作。写入Elasticsearch或阅读时完成了吗?究竟如何设置?


问题答案:

要使用Java API应用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 ” ,“

  • 这看起来有点吓人。最好的办法是什么?输出真的需要这种复杂类型吗?