ElasticSearch java 如何更改索引最大查询窗口(max_result_window)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch java 如何更改索引最大查询窗口(max_result_window)相关的知识,希望对你有一定的参考价值。

在网上找到的curl -XPUT http://localhost:9200/indexName/_settings -d ' "index" : "max_result_window" : 100000' 这个方法不是java的,希望得到java代码实现的

参考技术A

java查询elasticsearch 有哪些索引

次查询可分为下面四个步骤:

    创建连接ElasticSearch服务的client.

    索引在ElasticSearch服务器上,进行索引的查询首先要和服务器创建连接,这是第一步。                              

    <code>Client client = TransportClient.builder().build()

    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

    </code>

2.创建QueryBuilder.

QueryBuilder可以设置单个字段的查询,也可以设置多个字段的查询.

e.g.1: 查询title字段中包含hibernate关键字的文档:

<code>QueryBuilder qb1 = termQuery("title", "hibernate");

</code>


e.g.2: 查询title字段或content字段中包含git关键字的文档:

<code>QueryBuilder qb2= QueryBuilders.multiMatchQuery("git", "title","content");

</code>


3.执行查询

通过client设置查询的index、type、query.返回一个SearchResponse对象:

<code>SearchResponse response = client.prepareSearch("blog").setTypes("article").setQuery(qb2).execute()

.actionGet();

</code>


4.处理查询结果

SearchResponse对象的getHits()方法获取查询结果,返回一个SearchHits的集合,遍历集合获取查询的文档信息:

?


1

2

<code>SearchHits hits = response.getHits();

</code>

追问

说了这么多,没有回答我的问题

参考技术B // 5.6版本,ES Java API 差几个版本就完全不一样了。

// 封装方法
public boolean updSetting(String index, Map settings) 
    UpdateSettingsRequest request = Requests.updateSettingsRequest(index).settings(settings);
    UpdateSettingsResponse response = this.client.admin().indices().updateSettings(request).actionGet();
    return response.isAcknowledged();


// 调用
JSONObject settings = JSONObject.fromObject("\\"max_result_window\\": \\"200000000\\"");
updSetting(index, settings);

// 完全拿方法名摸索出来的

如何使用 NEST 更新 ElasticSearch 索引中的现有文档?

【中文标题】如何使用 NEST 更新 ElasticSearch 索引中的现有文档?【英文标题】:How do I update an existing document inside ElasticSearch index using NEST? 【发布时间】:2014-05-22 01:09:19 【问题描述】:

我正在尝试更新现有的索引文档。 我有索引标签、标题和所有者字段。现在当用户更改标题时,我需要在索引中查找并更新文档。

我应该更新和替换整个文档还是只替换标题字段?

public void UpdateDoc(ElasticsearchDocument doc)

 Uri localhost = new Uri("http://localhost:9200");
 var setting = new ConnectionSettings(localhost);
 setting.SetDefaultIndex("movies");
 var client = new ElasticClient(setting);

 IUpdateResponse resp = client.Update<ElasticsearchDocument, IndexedDocument>(
                                  d => d.Index("movies")
                                        .Type(doc.Type)
                                        .Id(doc.Id), doc);

它只是不起作用。上面的代码会产生语法错误。 有谁知道使用 ElasticSearch 的 C# NEST 客户端执行此操作的正确方法?

【问题讨论】:

【参考方案1】:

我已经使用如下方法成功地使用 NEST 更新了我的 Elasticsearch 索引中的现有项目。请注意,在此示例中,您只需要发送包含您希望更新的字段的部分文档。

    // Create partial document with a dynamic
    dynamic updateDoc = new System.Dynamic.ExpandoObject();
    updateDoc.Title = "My new title";

    var response = client.Update<ElasticsearchDocument, object>(u => u
        .Index("movies")
        .Id(doc.Id)
        .Document(updateDoc)
     );

您可以在NEST Update Unit Tests from the GitHub Source 中找到更多发送更新方法的示例。

【讨论】:

updateDoc.Title = "我的新标题";不正确,它给出了语法错误。我会尝试几种不同的方法 动态 MyDynamic = new System.Dynamic.ExpandoObject();我是怎么做到的 如何获得doc.Id?我必须先查询文档吗?【参考方案2】:

Nest 7.x 中更好的解决方案:

 await _client.UpdateAsync<ElasticSearchDoc>(doc.Id, u => u.Index("movies").Doc(new ElasticSearchDoc  Title = "Updated title!" ));

【讨论】:

【参考方案3】:

实际上对于 Nest 2 来说是:

dynamic updateFields = new ExpandoObject();
updateFields.IsActive = false;
updateFields.DateUpdated = DateTime.UtcNow;

await _client.UpdateAsync<ElasticSearchDoc, dynamic>(new DocumentPath<ElasticSearchDoc>(id), u => u.Index(indexName).Doc(updateFields))

【讨论】:

【参考方案4】:

让 Nest 2 更新已包含 ID 字段的 POCO:

 var task = client.UpdateAsync<ElasticsearchDocument>(
                    new DocumentPath<ElasticsearchDocument>(doc), u => 
                        u.Index(indexName).Doc(doc));

【讨论】:

【参考方案5】:

也使用 Nest 7.x。

如果您只想进行部分更新,您可以使用对我来说非常有用的方法。您必须指定“T, K”,其中 T 是完整对象,K 是部分对象。为每个部分更新创建一个 POCO 有点过度工作和烦人。 对于这个问题,你可以像这样使用匿名对象

 public bool PartialUpdate(string id, object entity)
 
     var result = _elasticClient.Update<T, object>(DocumentPath<T>.Id(id), i => i.Index(_indexName).Doc(entity));

     return result.IsValid;
 

我使用的是 Elastic Common Schema,所以这里是一个用于更新的部分对象的示例:

new

    Labels = new Dictionary<string, object>
    
         "EscalateTo", alert.AlertState == AlertState.Escalation ? escalationId : "" ,
         "EscalateFrom", alert.AlertState == AlertState.Descalation ? escalationId : "" ,
    ,
    Event = new
    
        End = alert.WindowEnd,
        Duration = (alert.WindowEnd - storedAlert.StartTime.Value).Ticks
    
;

【讨论】:

以上是关于ElasticSearch java 如何更改索引最大查询窗口(max_result_window)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NEST 更新 ElasticSearch 索引中的现有文档?

Elasticsearch:运用 Java 对索引文档进行搜索

ELK学习总结(4-1)elasticsearch更改mapping(不停服务重建索引)

一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)

elasticsearch 锁

Elasticsearch必知必会的干货知识二:ES索引操作技巧