我使用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
我正在尝试使用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) 我目前正在使用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.我可以知道我在这里做错了吗?谢谢.
我在SocketTimeoutException从/向弹性检索/插入数据时面临。当周围有 时,就会发生这种情况10-30 request/second。这些请求是 get/put 的组合。
这是我的弹性配置:
3 master nodes 每一个 4GB RAM2 data nodes 每一个 8GM RAM休息高级客户端:
<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)索引信息:
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
问题:
自从从 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) 我正在尝试通过手动将值传递给构造函数来创建一个虚拟的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) 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]
我想了解更多有关弹性删除的信息,它是 Java 高级删除 api 和天气,可以执行批量删除。
以下是配置信息
添加了弹性依赖项:
<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)
在阅读文档时,我遇到了以下我无法理解的查询。
如文档中所示:It’s also possible to limit the number of processed documents by setting size. request.setSize(10);
处理的文档是什么意思?它会只删除 10 个文件吗?
我应该设置什么批量大小?request.setBatchSize(100);它的性能取决于我们要删除多少文件?
我应该首先打电话给get no of documents& 基于setBatchSize应该改变吗?
request.setSlices(2); 切片应该取决于弹性集群中执行器机器有多少核心或没有核心?
在文档setSlices(2)中给出了我无法在 class 中找到的方法org.elasticsearch.index.reindex.DeleteByQueryRequest。我在这里缺少什么?
让我们考虑一下我是否在异步模式下执行这个删除查询需要 …
这可能是一个愚蠢的问题,但我无法找到答案。如果我的集群中有 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和端口吗?请帮忙
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
elasticsearch ×10
java ×5
client ×2
azure ×1
java-8 ×1
json ×1
junit ×1
server ×1
spring-boot ×1
upsert ×1