use of com.xiaomi.linden.thrift.common.LindenResult in project linden by XiaoMi.
the class TestMultiLindenCore method testDocNumDivision.
@Test
public void testDocNumDivision() throws Exception {
String path = FilenameUtils.concat(INDEX_DIR, "size/");
lindenConfig.setIndexDirectory(path).setLindenCoreMode(LindenConfig.LindenCoreMode.HOTSWAP).setMultiIndexDivisionType(LindenConfig.MultiIndexDivisionType.DOC_NUM).setMultiIndexDocNumLimit(100).setMultiIndexMaxLiveIndexNum(4);
Deencapsulation.setField(DocNumLimitMultiIndexStrategy.class, "INDEX_CHECK_INTERVAL_MILLISECONDS", -10);
lindenCore = new MultiLindenCoreImpl(lindenConfig);
for (int i = 0; i < 400; ++i) {
JSONObject json = new JSONObject();
json.put("type", "index");
JSONObject content = new JSONObject();
content.put("id", i);
content.put("title", "test " + i);
json.put("content", content);
handleRequest(json.toJSONString());
}
lindenCore.commit();
lindenCore.refresh();
Assert.assertEquals(4, lindenCore.getServiceInfo().getIndexNamesSize());
Assert.assertEquals(400, lindenCore.getServiceInfo().getDocsNum());
String bql = "select * from linden source";
LindenSearchRequest request = bqlCompiler.compile(bql).getSearchRequest();
LindenResult result = lindenCore.search(request);
Assert.assertEquals(400, result.getTotalHits());
for (int i = 0; i < 400; ++i) {
JSONObject json = new JSONObject();
json.put("type", "index");
JSONObject content = new JSONObject();
content.put("id", i + 400);
content.put("title", "test " + i);
json.put("content", content);
handleRequest(json.toJSONString());
}
lindenCore.commit();
lindenCore.refresh();
LindenServiceInfo serviceInfo = lindenCore.getServiceInfo();
Assert.assertEquals(4, serviceInfo.getIndexNamesSize());
Assert.assertEquals(400, serviceInfo.getDocsNum());
lindenCore.close();
}
use of com.xiaomi.linden.thrift.common.LindenResult in project linden by XiaoMi.
the class CoreLindenServiceImpl method handleClusterSearchRequest.
@Override
public Future<LindenResult> handleClusterSearchRequest(final String bql) {
final Stopwatch sw = Stopwatch.createStarted();
return clusterExecutorPool.apply(new Function0<LindenResult>() {
@Override
public LindenResult apply() {
LindenResult result = null;
String logTag = null;
try {
long eps = sw.elapsed(TimeUnit.MILLISECONDS);
if (eps > 10) {
LOGGER.warn("Warning: clusterExecutorPool took " + eps + "ms to start handleClusterSearchRequest.");
if (eps > clusterFuturePoolWaitTimeout) {
result = buildLindenFailedResult("Waiting time is too long, " + eps + "ms in cluster future pool");
return result;
}
}
LindenRequest request = bqlCompiler.compile(bql);
if (request.isSetSearchRequest()) {
LindenSearchRequest searchRequest = request.getSearchRequest();
searchRequest.setOriginQuery(bql);
result = lindenCluster.search(searchRequest);
if (result.isSuccess()) {
logTag = "search";
} else {
logTag = "failureSearch";
}
} else {
result = new LindenResult().setSuccess(false).setError("invalid search Bql");
logTag = "invalidSearchBql";
}
} catch (Exception e) {
String errorStackInfo = Throwables.getStackTraceAsString(e);
result = buildLindenFailedResult(errorStackInfo);
logTag = "exceptionalSearchBql";
} finally {
metricsManager.time(sw.elapsed(TimeUnit.NANOSECONDS), logTag);
result.setCost((int) sw.elapsed(TimeUnit.MILLISECONDS));
if (result.isSuccess()) {
LOGGER.info("Cluster search request succeeded bql: {}, hits: {}, cost: {} ms.", bql, result.getHitsSize(), result.getCost());
} else {
LOGGER.error("Cluster search request failed bql: {}, error: {}, cost: {} ms.", bql, result.getError(), result.getCost());
}
return result;
}
}
});
}
use of com.xiaomi.linden.thrift.common.LindenResult in project linden by XiaoMi.
the class CoreLindenServiceImpl method handleClusterBqlRequest.
@Override
public Future<LindenResult> handleClusterBqlRequest(final String bql) {
final Stopwatch sw = Stopwatch.createStarted();
return clusterExecutorPool.apply(new Function0<LindenResult>() {
@Override
public LindenResult apply() {
LindenResult result = null;
String logTag = null;
try {
long eps = sw.elapsed(TimeUnit.MILLISECONDS);
if (eps > 10) {
LOGGER.warn("Warning: clusterExecutorPool took " + eps + "ms to start handleClusterBqlRequest.");
if (eps > clusterFuturePoolWaitTimeout) {
result = buildLindenFailedResult("Waiting time is too long, " + eps + "ms in cluster future pool");
logTag = "poolWaitTimeout";
return result;
}
}
LindenRequest request = bqlCompiler.compile(bql);
if (request.isSetSearchRequest()) {
LindenSearchRequest searchRequest = request.getSearchRequest();
searchRequest.setOriginQuery(bql);
result = lindenCluster.search(searchRequest);
if (result.isSuccess()) {
logTag = "search";
} else {
logTag = "failureSearch";
}
} else if (request.isSetDeleteRequest()) {
Response response = lindenCluster.delete(request.getDeleteRequest());
result = new LindenResult().setSuccess(response.isSuccess()).setError(response.getError());
if (result.isSuccess()) {
logTag = "delete";
} else {
logTag = "failureDelete";
}
} else {
result = buildLindenFailedResult("unsupported Bql");
logTag = "unsupportedBql";
}
} catch (Exception e) {
String errorStackInfo = Throwables.getStackTraceAsString(e);
result = buildLindenFailedResult(errorStackInfo);
logTag = "exceptionalBql";
} finally {
metricsManager.time(sw.elapsed(TimeUnit.NANOSECONDS), logTag);
result.setCost((int) sw.elapsed(TimeUnit.MILLISECONDS));
if (result.isSuccess()) {
LOGGER.info("Cluster request succeeded bql: {}, hits: {}, cost: {} ms.", bql, result.getHitsSize(), result.getCost());
} else {
LOGGER.error("Cluster request failed bql: {}, error: {}, cost: {} ms.", bql, result.getError(), result.getCost());
}
return result;
}
}
});
}
use of com.xiaomi.linden.thrift.common.LindenResult in project linden by XiaoMi.
the class CoreLindenServiceImpl method handleBqlRequest.
// handle single instance request called warmer
@Override
public Future<LindenResult> handleBqlRequest(final String bql) {
final Stopwatch sw = Stopwatch.createStarted();
return instanceExecutorPool.apply(new Function0<LindenResult>() {
@Override
public LindenResult apply() {
LindenResult result = null;
String logTag = null;
try {
long eps = sw.elapsed(TimeUnit.MILLISECONDS);
if (eps > 10) {
LOGGER.warn("Warning: instanceExecutorPool took " + eps + "ms to start handleBqlRequest.");
if (eps > instanceFuturePoolWaitTimeout) {
result = buildLindenFailedResult("Waiting time is too long, " + eps + "ms in instance future pool");
return result;
}
}
LindenRequest lindenRequest = bqlCompiler.compile(bql);
if (lindenRequest.isSetSearchRequest()) {
LindenSearchRequest searchRequest = lindenRequest.getSearchRequest();
searchRequest.setOriginQuery(bql);
result = lindenCore.search(searchRequest);
if (result.isSuccess()) {
logTag = "singleInstanceSearch";
} else {
logTag = "failureSingleInstanceSearch";
}
} else if (lindenRequest.isSetDeleteRequest()) {
Response response = lindenCore.delete(lindenRequest.getDeleteRequest());
result = new LindenResult().setSuccess(response.isSuccess()).setError(response.getError());
if (result.isSuccess()) {
logTag = "singleInstanceDelete";
} else {
logTag = "failureSingleInstanceDelete";
}
} else {
result = buildLindenFailedResult("unsupported Bql");
logTag = "unsupportedSingleInstanceBql";
}
} catch (Exception e) {
String errorStackInfo = Throwables.getStackTraceAsString(e);
result = buildLindenFailedResult(errorStackInfo);
logTag = "exceptionalSingleInstanceRequest";
} finally {
metricsManager.time(sw.elapsed(TimeUnit.NANOSECONDS), logTag);
result.setCost((int) sw.elapsed(TimeUnit.MILLISECONDS));
if (result.isSuccess()) {
LOGGER.info("Single instance request succeeded bql: {}, hits: {}, cost: {} ms.", bql, result.getHitsSize(), result.getCost());
} else {
LOGGER.error("Single instance request failed bql: {}, error: {}, cost: {} ms.", bql, result.getError(), result.getCost());
}
return result;
}
}
});
}
use of com.xiaomi.linden.thrift.common.LindenResult in project linden by XiaoMi.
the class TestLindenJiebaAnalyzerSearchMode method testSearchMode.
@Test
public void testSearchMode() throws IOException {
String bql = "select * from linden by query is \"title:刘华清\"";
LindenSearchRequest request = bqlCompiler.compile(bql).getSearchRequest();
LindenResult result = lindenCore.search(request);
Assert.assertEquals(2, result.getTotalHits());
// phrase test
bql = "select * from linden by query is 'title:\"刘华清\"'";
request = bqlCompiler.compile(bql).getSearchRequest();
result = lindenCore.search(request);
Assert.assertEquals(2, result.getTotalHits());
bql = "select * from linden by query is 'title:\"海军上将刘华清\"'";
request = bqlCompiler.compile(bql).getSearchRequest();
result = lindenCore.search(request);
Assert.assertEquals(2, result.getTotalHits());
// snippet test
bql = "select * from linden by query is 'title:(海军上将刘华清中国龙)' snippet title";
request = bqlCompiler.compile(bql).getSearchRequest();
result = lindenCore.search(request);
Assert.assertEquals(2, result.getTotalHits());
Assert.assertEquals("<b>海军上将</b><b>刘华清</b>", result.getHits().get(0).getSnippets().get("title").getSnippet());
Assert.assertEquals("<b>海军上将</b><b>刘华清</b>!!! <b>中国</b> 人民 李玉洁 尚铁龙 胡晓光", result.getHits().get(1).getSnippets().get("title").getSnippet());
bql = "select * from linden by query is 'title:(海军中国铁龙)' snippet title";
request = bqlCompiler.compile(bql).getSearchRequest();
result = lindenCore.search(request);
Assert.assertEquals(1, result.getTotalHits());
Assert.assertEquals("<b>中国</b> 人民 李玉洁 尚铁龙 胡晓光", result.getHits().get(0).getSnippets().get("title").getSnippet());
}
Aggregations