elasticsearch正在花时间同时进行更新和搜索

时间:2014-08-22 09:38:15

标签: java elasticsearch

我在弹性搜索文档中进行更新,同时一个休息api正在调用搜索结果。以下是我的代码。

public String updateElasticsearchDocument(String index, String type, List<String> indexID) {
    Client client = ESClientFactory.getInstance();
    UpdateResponse updateResponse = null;
    JSONObject jsonResponse = new JSONObject();
    JSONObject json =new JSONObject();
    int i=1;

    try {
        for(String id : indexID)
        {   
         updateResponse = client.prepareUpdate(index, type, id)
                          .setDoc(jsonBuilder()
                                  .startObject().field("view_mode", "read")
                                  .endObject())
                                .setDocAsUpsert(true)
                                .setFields("_source")
                          .execute().actionGet();
         logger.info("updating the document for type= "+ updateResponse.getType()+ " for id= "+ updateResponse.getId());

         json.put("indexID"+i, updateResponse.getId());
         i++;
        }       
        jsonResponse.put("updated_index", json);

    } catch (ActionRequestValidationException e) {
        logger.warn(this.getClass().getName() + ":" + "updateDocument: "
                        + e.getMessage(), e);
    } 
    catch (ElasticsearchException e) {
        logger.warn(this.getClass().getName() + ":" + "updateDocument: "
                        + e.getMessage(), e);
        e.printStackTrace();
    } catch (IOException e) {
        logger.warn(this.getClass().getName() + ":" + "updateDocument: "
                + e.getMessage(), e);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return jsonResponse.toString();
}

搜索查询我在这里暂停

POST /monitoring/quota-management/_search

    {
          "query": {"match": {
              "view_mode": "read"
           }}, 
        "sort": [
           {
              "_timestamp": {
                 "order": "desc"
              }
           }
        ],
        "size": 10
    }

现在这两个请求之间存在时间差,我必须等待40-50秒才能获得更新的搜索结果。这影响了生产应用。请告诉我这里需要做些什么来最大限度地缩短所花费的时间

-Subhadip

1 个答案:

答案 0 :(得分:1)

如果您希望立即为数据编制索引,可以像下面这样设置刷新更新:

client.prepareUpdate(index,type,id).setRefresh(true).setDoc(...)。execute()。actionGet();

请注意,如果您经常更新,则需要做出权衡。索引可能会占用大量的IO / cpu。

良好的中间地点是将刷新间隔设置为合理的间隔。