标签: elasticsearch-java-api

如何使用弹性java客户端与aws elasticsearch服务交谈?

我使用AWS elasticsearch服务(非EC2)设置了elasticsearch服务器.它给了我一个端点https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com/如果我点击这个端点(注意没有指定端口)我可以得到预期的

{
  status: 200,
  name: "Mastermind",
  cluster_name: "xxxx",
  version: {
    number: "1.5.2",
    build_hash: "yyyyyy",
    build_timestamp: "2015-04-27T09:21:06Z",
    build_snapshot: false,
    lucene_version: "4.10.4"
  },
  tagline: "You Know, for Search"
}
Run Code Online (Sandbox Code Playgroud)

问题是如何通过不带端口号的elasticsearch java客户端获取此信息?我得到的示例代码是

Client client = TransportClient.builder().build()
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300));
Run Code Online (Sandbox Code Playgroud)

如果我使用此代码并将"host1"替换为我的端点,我将得到"NoNodeAvailableException"

ps:我使用的java客户端版本是2.0.0.

编辑 我最终决定选择第三方REST客户端Jest.但Brooks在下面回答的内容也非常有用 - AWS确实将端口80用于http,将443用于https.对我来说阻止者是我猜的防火墙.

Edit2 AWS ES服务文档明确说明:
该服务支持端口80上的HTTP,但不支持TCP传输.

amazon-web-services elasticsearch elasticsearch-java-api amazon-elasticsearch

13
推荐指数
1
解决办法
2万
查看次数

如何使用Elasticsearch Node Client Java连接到远程服务器

我正在尝试使用Elasticsearch Java NodeBuilder Client连接到我的服务器.但是我没有看到任何指定我的服务器地址和端口的选项(就像我们可以在Transport Client中一样使用addNewTransportAddress("serveraddress", port)).如何让Node Client连接到我的服务器?代码如下,我在哪里提到要连接的服务器地址?

//On Startup
Node node = nodeBuilder()
        .clusterName("elasticsearch")
        .data(false) //No shards allocated; or can set client to true
        .client(true) //No shards allocated; or can set data to false
        .node();

//Node Client
Client client = node.client();

//Get API       
GetResponse response = client.prepareGet("indexname", "type", "id")
        .execute()
        .actionGet();

System.out.println("----------------Index Output Begin----------------");
System.out.println("Index Name: " + response.getIndex());
System.out.println("Type: " + response.getType());
System.out.println("Document ID: " + response.getId());
System.out.println("Document Version: " + response.getVersion());
System.out.println("Source: " + response.getSourceAsString());
Run Code Online (Sandbox Code Playgroud)

java client elasticsearch server elasticsearch-java-api

8
推荐指数
1
解决办法
9832
查看次数

使用Java在Elasticsearch中按查询更新

我目前正在使用Elasticsearch V2.3.1.我想在Java中使用以下Elasticsearch查询.

POST /twitter/_update_by_query
{
  "script": {
    "inline": "ctx._source.List = [‘Item 1’,’Item 2’]”
  },
  "query": {
    "term": {
      "user": "kimchy"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

上述查询搜索名为"kimchy"的"user",并使用给定值更新"List"字段.此查询同时更新多个文档.我在这里阅读了有关Java的更新API https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.3/java-docs-update.html但找不到我要找的内容.Java的Update API仅讨论一次更新单个文档.有没有办法更新多个文件?对不起,如果我错过了一些明显的东西.感谢您的时间.

更新:

我尝试了下面的Java代码:

Client client = TransportClient.builder().addPlugin(ReindexPlugin.class)
    .build().addTransportAddress(new InetSocketTransportAddress(
        InetAddress.getByName("127.0.0.1"), 9300));

UpdateByQueryRequestBuilder ubqrb = UpdateByQueryAction.INSTANCE
    .newRequestBuilder(client);

Script script = new Script("ctx._source.List = [\"Item 1\",\"Item 2\"]");

//termQuery is not recognised by the program
BulkIndexByScrollResponse r = ubqrb.source("twitter").script(script)
    .filter(termQuery("user", "kimchy")).execute().get();
Run Code Online (Sandbox Code Playgroud)

所以我编辑了如上所述的Java程序,并且Java不识别termQuery.我可以知道我在这里做错了吗?谢谢.

java elasticsearch elasticsearch-java-api

8
推荐指数
1
解决办法
7507
查看次数

使用 Rest 高级客户端检索或插入数据到 Elastic Search 时出现 SocketTimeoutException

我在SocketTimeoutException从/向弹性检索/插入数据时面临。当周围有 时,就会发生这种情况10-30 request/second。这些请求是 get/put 的组合。

这是我的弹性配置:

  • 3 master nodes 每一个 4GB RAM
  • 2 data nodes 每一个 8GM RAM
  • 连接到上述数据节点的 Azure 负载均衡器(似乎只打开了 9200 端口)。并且 java 客户端连接到这个负载均衡器,因为它只是公开的。
  • 弹性版本:7.2.0
  • 休息高级客户端:

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.2.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.2.0</version>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

索引信息:

  • 索引分片:2
  • 索引副本:1
  • 索引总字段数:10000
  • 来自 kibana 的索引大小:Total- 27.2 MB&Primaries: 12.2MB
  • 索引结构:
    {
      "dev-index": {
        "mappings": {
          "properties": {
            "dataObj": {
              "type": "object",
              "enabled": false
            },
            "generatedID": {
              "type": "keyword"
            },
            "transNames": { //it's array of string
              "type": …
    Run Code Online (Sandbox Code Playgroud)

java azure elasticsearch elasticsearch-java-api azure-elasticpool

8
推荐指数
1
解决办法
8074
查看次数

Elasticsearch 7.x 断路器 - 数据过大 - 故障排除

问题:
自从从 ES-5.4 升级到 ES-7.2 后,当我尝试从我的多线程 Java 应用程序(使用elasticsearch-rest-high-level-client-7.2.0.jarjava 客户端)写入并发批量请求(或/和搜索请求)时,我开始收到“数据太大”错误到 2-4 个节点的 ES 集群。

我的ES配置:

Elasticsearch version: 7.2

custom configuration in elasticsearch.yml:   
    thread_pool.search.queue_size = 20000  
    thread_pool.write.queue_size = 500

I use only the default 7.x circuit-breaker values, such as:  
    indices.breaker.total.limit = 95%  
    indices.breaker.total.use_real_memory = true  
    network.breaker.inflight_requests.limit = 100%  
    network.breaker.inflight_requests.overhead = 2  
Run Code Online (Sandbox Code Playgroud)

来自 elasticsearch.log 的错误:

    {
      "error": {
        "root_cause": [
          {
            "type": "circuit_breaking_exception",
            "reason": "[parent] Data too large, data for [<http_request>] would be [3144831050/2.9gb], which is larger than the limit of …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-java-api elasticsearch-7

8
推荐指数
2
解决办法
8181
查看次数

为ElasticSearch测试用例创建虚拟SearchResponse实例

我正在尝试通过手动将值传递给构造函数来创建一个虚拟的SearchResponse对象.我有一个JUnit测试类,我正在使用这个虚拟值来模拟实际的方法调用.尝试使用以下方法

public SearchResponse actionGet() throws ElasticsearchException {
    ShardSearchFailure[] shardFailures = new ShardSearchFailure[0];
    int docId = 0;
    String id = "5YmRf-6OTvelt29V5dphmw";
    Map<String, SearchHitField> fields = null;

    InternalSearchHit internalSearchHit = new InternalSearchHit(docId, id,
            null, fields);
    InternalSearchHit[] internalSearchHit1 = { internalSearchHit };

    InternalSearchResponse EMPTY = new InternalSearchResponse(
            new InternalSearchHits(internalSearchHit1, 0, 0), null, null,
            null, false);
    SearchResponse searchResponse = new SearchResponse(EMPTY, "scrollId",
            1, 1, 1000, shardFailures);
    return searchResponse;
}
Run Code Online (Sandbox Code Playgroud)

这是我直接查询elasticsearch时json的实际值.

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0
  }, …
Run Code Online (Sandbox Code Playgroud)

java junit json elasticsearch elasticsearch-java-api

7
推荐指数
1
解决办法
5372
查看次数

如何通过JSON将查询设置为Elasticsearch SearchRequest?

Elasticsearch:6.1.2

我有一个通过JSON的输入查询,并希望使用高级Java API来使用该查询数据构建搜索请求.

String jsonQuery = "..."
SearchRequest searchRequest = new SearchRequest()
SearchSourceBuilder builder = ?
searchRequest.source(builder);
Run Code Online (Sandbox Code Playgroud)

我尝试通过以下方式构建构建器:

SearchSourceBuilder.fromXContent(XContentType.JSON.xContent().createParser(NamedXContentRegistry.EMPTY, query));
Run Code Online (Sandbox Code Playgroud)

但是产量:

引起:org.elasticsearch.ElasticsearchException:org.elasticsearch.common.xcontent.NamedXContentRegistry.parseNamedObject(NamedXContentRegistry.java:129)〜[elasticsearch-6.1.2.jar:6.1.2] at此解析器不支持namedObject org.elasticsearch.common.xcontent.support.AbstractXContentParser.namedObject(AbstractXContentParser.java:402)〜[elasticsearch-6.1.2.jar:6.1.2] at org.elasticsearch.index.query.AbstractQueryBuilder.parseInnerQueryBuilder(AbstractQueryBuilder.java) :313)〜[elasticsearch-6.1.2.jar:6.1.2]在org.elasticsearch.search.builder.SearchSourceBuilder.parseXContent(SearchSourceBuilder.java:1003)〜[elasticsearch-6.1.2.jar:6.1.2]在org.elasticsearch.search.builder.SearchSourceBuilder.fromXContent(SearchSourceBuilder.java:115)〜[elasticsearch-6.1.2.jar:6.1.2]

elasticsearch elasticsearch-java-api

7
推荐指数
1
解决办法
2254
查看次数

Elastic Search delete_by_query 如何工作?当我们插入新数据并在删除文档时检索相同数据时会发生什么?

我想了解更多有关弹性删除的信息,它是 Java 高级删除 api 和天气,可以执行批量删除。

以下是配置信息

  • 爪哇:8
  • 弹性版本:7.1.1
  • 添加了弹性依赖项:

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.1.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.1.1</version>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

在我的情况下,每天大约有 10K 条记录被添加到索引中dev-answer。我想触发删除操作(这可以每天或每周或每月触发一次),index如果满足特定条件,它将基本上删除上面的所有文件。(我会放弃DeleteByQueryRequest

对于删除,我指的是最新文档中给出的 api 。

DeleteByQueryRequest request = new DeleteByQueryRequest("source1", "source2");
Run Code Online (Sandbox Code Playgroud)

在阅读文档时,我遇到了以下我无法理解的查询。

  1. 如文档中所示:It’s also possible to limit the number of processed documents by setting size. request.setSize(10); 处理的文档是什么意思?它会只删除 10 个文件吗?

  2. 我应该设置什么批量大小?request.setBatchSize(100);它的性能取决于我们要删除多少文件?

    我应该首先打电话给get no of documents& 基于setBatchSize应该改变吗?

  3. request.setSlices(2); 切片应该取决于弹性集群中执行器机器有多少核心或没有核心?

  4. 在文档setSlices(2)中给出了我无法在 class 中找到的方法org.elasticsearch.index.reindex.DeleteByQueryRequest。我在这里缺少什么?

  5. 让我们考虑一下我是否在异步模式下执行这个删除查询需要 …

elasticsearch java-8 elasticsearch-java-api

7
推荐指数
1
解决办法
2782
查看次数

Elasticsearch集群连接

这可能是一个愚蠢的问题,但我无法找到答案。如果我的集群中有 3 个节点,那么在创建传输客户端时是否需要提供每个节点的 IP 和端口,以便我可以与每个节点进行通信?

new PreBuiltTransportClient(settings, AuthenticationPlugin.class).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),
                        Integer.parseInt("9300")))
                        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),
                        Integer.parseInt("9301")))
InetSocketTransportAddress(InetAddress.getByName("localhost"),
                        Integer.parseInt("9302")));;
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让我不需要提供每个节点的IP和端口吗?请帮忙

java client elasticsearch elasticsearch-java-api

6
推荐指数
1
解决办法
1513
查看次数

ElasticSearch - Spring Boot - Upsert is throwing DocumentMissingException

I am using Spring Boot and ElasticSearch. When I am trying to upsert using Spring, it is throwing DocumentMissingException when there is no document present in the ElasticSearch. The same code works fine when there is a document present in the ElasticSearch.

Exception Stacktrace:

org.springframework.data.elasticsearch.ElasticsearchException: Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages [{U65929AR1978SGC001748=[company/vteSxfKoRF-k4g982vissw][[company][2]] DocumentMissingException[[_doc][U65929AR1978SGC001748]: document missing], U45309AR2000PTC006288=[company/vteSxfKoRF-k4g982vissw][[company][3]] DocumentMissingException[[_doc][U45309AR2000PTC006288]: document missing],...

Code:

public <S extends Company> void saveAllCustom(Iterable<S> companies) {

    List<UpdateQuery> updateQueries = new ArrayList<UpdateQuery>();

    ObjectMapper oMapper = new …
Run Code Online (Sandbox Code Playgroud)

upsert elasticsearch spring-boot spring-data-elasticsearch elasticsearch-java-api

6
推荐指数
1
解决办法
199
查看次数