Skip to content

Instantly share code, notes, and snippets.

@fivesmallq
Created December 4, 2015 05:44
Show Gist options
  • Save fivesmallq/c31c392cb596f6a8a24c to your computer and use it in GitHub Desktop.
Save fivesmallq/c31c392cb596f6a8a24c to your computer and use it in GitHub Desktop.
/**
* website搜索.
*
* @param id
* @param q
* @param sort
* @param offset
* @param limit
* @return
*/
private static Response websiteSearch(String id, String q, String sort,
long offset, long limit, String fields, long start, long end,
boolean current, boolean debug) {
if (StringUtils.isEmpty(q)) {
q = "*";
}
Logger.info("debug enable:%s", debug);
if (limit == 0) {
limit = 100;
}
if (StringUtils.isEmpty(sort)) {
sort = "_id:desc";
}
if (StringUtils.isEmpty(fields)) {
fields = "";
}
Iterable<String> splitter = Splitter.on(",").trimResults()
.omitEmptyStrings().split(sort);
BoolQueryBuilder queryBuilder = QueryBuilders
.boolQuery()
.must(QueryBuilders.queryString("current:(" + current + ")"))
.must(QueryBuilders.queryString(q))
.must(QueryBuilders.simpleQueryString("websiteId:(" + id + ")"));
if (end == 0) {
end = System.currentTimeMillis();
}
if (start != 0 && end != 0) {
queryBuilder.must(new RangeQueryBuilder("timestamp").gte(start)
.lte(end).boost(1));
}
SearchRequestBuilder requestBuilder = client.prepareSearch(esIndex)
.setQuery(queryBuilder).setTypes(esIndexType)
.setFrom((int) offset).setSize((int) limit);
// process sort
for (String one : splitter) {
String[] sortField = StringUtils.split(one, ":");
if (sortField.length == 1) {
requestBuilder.addSort(sortField[0], Utility.getSort("asc"));
} else {
requestBuilder.addSort(sortField[0],
Utility.getSort(sortField[1]));
}
}
// process fields
Iterable<String> fieldsIterable = Splitter.on(",").trimResults()
.omitEmptyStrings().split(fields);
boolean onlyData = false;
for (String one : fieldsIterable) {
if (one.equals("data.*")) {
onlyData = true;
} else {
requestBuilder.addField(one);
}
}
Logger.info("search request:%s", requestBuilder);
SearchResponse response = requestBuilder.execute().actionGet();
SearchHit[] results = response.getHits().getHits();
Logger.info("Current results: %s ", results.length);
List datas = Lists.newLinkedList();
for (SearchHit hit : results) {
Map<String, Object> returnData = new LinkedHashMap<>();
if (StringUtils.isNotEmpty(fields) && !onlyData) {
Map<String, SearchHitField> fieldsResult = hit.getFields();
Map<String, Object> dataFieldValues = Maps.newLinkedHashMap();
for (Entry<String, SearchHitField> one : fieldsResult
.entrySet()) {
// XXX 这里只处理了单值,多值的情况没有处理.
String name = one.getValue().getName();
if (StringUtils.startsWith(name, "data.")) {
name = StringUtils.substringAfter(name, ".");
dataFieldValues.put(name, one.getValue().getValue());
returnData.put("data", dataFieldValues);
} else {
returnData.put(name, one.getValue().getValue());
}
}
returnData.remove("current");
datas.add(returnData);
} else {
Map<String, Object> result = hit.getSource();
if (onlyData) {
returnData.put("data", result.get("data"));
datas.add(returnData);
} else {
if (!debug) {
result.remove("source");
}
datas.add(result);
}
}
}
Response responseNovaData = new Response();
responseNovaData.setCode(ResponseCode.SUCCESS);
responseNovaData.setResults(datas);
responseNovaData.setTotal_count(response.getHits().getTotalHits());
return responseNovaData;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment