使用NEST操作elasticsearch,更新后无法立即搜索的问题

问题复现

        在跟前端进行联调的过程中发现了一个问题,向elasticsearch中增加一条文档数据后,立即请求查询文档列表,发现刚刚新增的文档查不出来,刷新页面或等1s后重新再次请求查询才能查询出来,随后测试了删除文档列表和更新文档列表中的文档这两个接口,出现了同样的问题,即elasticsearch数据更新有延迟。

问题原因

        默认情况下ElasticSearch索引的refresh_interval为1秒,这意味着数据写1秒才就可以被搜索到。

        因为上述表现,所以称ElasticSearch是近实时搜索引擎。

        如果需要调整数据刷新方案,则有三种途径:

        设置数据刷新间隔:refresh_interval。
        调用数据刷新接口:_refresh。
        设置数据刷新策略:RefreshPolicy。

问题修复

1. 设置数据刷新间隔

# 调整所有index的刷新间隔位5分钟
PUT
{
  "settings": {
    "refresh_interval": "5m" 
  }
}

# 调整指定index的刷新间隔为180秒
PUT /log
{
  "settings": {
    "refresh_interval": "180s" 
  }
}

# 关闭全部index的数据刷新
PUT
{
  "settings": {
    "refresh_interval": -1 
  }
}

# 调整指定index的刷新间隔为1秒
PUT /indexname
{
  "settings": {
    "refresh_interval": "1s" 
  }
}

注意事项

  • 刷新间隔为-1代表关闭数据刷新。
  • 刷新间隔设置时应改携带单位,如:1h、2m、3s。
  • 应用在于大量写日志,而非近实时搜索,此时可以增大刷新间隔

2. 调用刷新接口

手动调用ElasticSearch提供的API进行数据刷新,如下:

# 刷新全部index的数据
POST /_refresh 

# 刷新指定index的数据
POST /indexname/_refresh

3. 设置刷新策略

可知有以下三种刷新策略:

RefreshPolicy#IMMEDIATE:
请求向ElasticSearch提交了数据,立即进行数据刷新,然后再结束请求。
优点:实时性高、操作延时短。
缺点:资源消耗高。


RefreshPolicy#WAIT_UNTIL:
请求向ElasticSearch提交了数据,等待数据完成刷新,然后再结束请求。
优点:实时性高、操作延时长。
缺点:资源消耗低。


RefreshPolicy#NONE:
默认策略。
请求向ElasticSearch提交了数据,不关系数据是否已经完成刷新,直接结束请求。
优点:操作延时短、资源消耗低。
缺点:实时性低。

结论

综合考虑下来,本人采取了调用刷新接口的方法进行处理,再文档增删改之后主动去调用了_refresh 接口已达到实时搜索可见的效果。

使用NEST调用_refresh接口方法如下:

private async Task RefreshIndex(string indexName)
{
    var _client = _clientProvider.GetClient(indexName);
    await _client.Indices.RefreshAsync(Indices.Parse(indexName));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C#操作Nest Elasticsearch,首先需要安装Nest NuGet包。可以通过以下步骤进行操作: 1. 打开Visual Studio或任何C#开发环境。 2. 在项目中,右键点击项目名称,选择"Manage NuGet Packages"。 3. 在NuGet包管理器中搜索"Nest",选择合适的版本并点击"Install"按钮以安装Nest NuGet包。 安装完成后,你可以按照以下示例代码来操作Nest Elasticsearch: ```csharp using Nest; // 创建一个Elasticsearch连接 var settings = new ConnectionSettings(new Uri("http://localhost:9200")) .DefaultIndex("your_index_name"); var client = new ElasticClient(settings); // 创建一个索引 var indexName = "your_index_name"; if (!client.Indices.Exists(indexName).Exists) { var createIndexResponse = client.Indices.Create(indexName, c => c .Map<YourDocumentType>(m => m.AutoMap()) ); if (!createIndexResponse.IsValid) { // 处理索引创建失败的情况 } } // 插入文档 var document = new YourDocumentType { // 设置文档属性值 }; var indexResponse = client.Index(document, i => i.Index(indexName)); if (!indexResponse.IsValid) { // 处理文档插入失败的情况 } // 搜索文档 var searchResponse = client.Search<YourDocumentType>(s => s .Index(indexName) .Query(q => q .Term(t => t .Field(f => f.YourField) .Value("your_value") ) ) ); if (searchResponse.IsValid) { // 处理搜索结果 foreach (var hit in searchResponse.Hits) { var yourDocument = hit.Source; // 处理搜索到的文档 } } ``` 以上代码展示了如何创建一个Elasticsearch连接、创建索引、插入文档以及搜索文档的基本操作。你可以根据自己的具体需求进行调整和扩展。记得替换代码中的"your_index_name"和"YourDocumentType"为你自己的索引名称和文档类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值